視圖View
尚硅谷MySQL筆記-10

視圖View

視圖 = 存儲起來的select語句

  • 就是創建一張專門用來看的虛擬表
  • 涉及的表稱為基表,基表也可以是視圖(可以嵌套作圖)
  • 對視圖進行DML操作,會影響基表中的資料,反之亦然
    • 但通常不會在視圖對資料進行操作,並且可以指定關閉這種權限
  • 刪除視圖不影響基表

創建視圖

CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 視圖名稱 [(欄位清單)]
AS 查詢語句
[WITH [CASCADED|LOCAL] CHECK OPTION]
-- 如果查詢基表時用了別名,那創出來的視圖欄位名稱就會是別名
create view employees_view
as select last_name '姓名',employee_id '員工編號'  from atguigudb.employees;

-- 年薪
create view year_salary (name,year_salary)
as
select employees.last_name,salary*12*(1+ifnull(commission_pct,0))
from atguigudb.employees;
-- 多表聯合
CREATE VIEW	dept_sum_vu
(name, minsal, maxsal, avgsal)
AS
SELECT d.department_name, MIN(e.salary), MAX(e.salary),AVG(e.salary)
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY  d.department_name;
-- 格式化輸出
CREATE VIEW emp_depart
AS
SELECT CONCAT(last_name,'任職於',department_name,'ㄅ') AS emp_dept
FROM employees e JOIN departments d
WHERE e.department_id = d.department_id

查看視圖屬性

DESC / DESCRIBE 視圖名稱;

-- 查看視圖的屬性資訊
SHOW TABLE STATUS LIKE '視圖名稱';

-- 查看視圖的詳細定義資訊
SHOW CREATE VIEW 視圖名稱;

修改視圖內的資料

一般來說不會這麼做,了解即可

  • 如果是一對一關係的視圖,且有權限的話,可以使用INSERT、UPDATE和DELETE語句去修改其中的資料
  • 有以下情況則不可修改:
    • 在定義視圖的時候指定了"ALGORITHM = TEMPTABLE",視圖將不支援INSERT和DELETE操作
    • 視圖中不包含基表中所有被定義為非空又未指定預設值的列,視圖將不支援INSERT操作
    • 在定義視圖的SELECT語句中使用了JOIN聯集查詢,視圖將不支援INSERT和DELETE操作
    • 在定義視圖的SELECT語句後的欄位清單中使用了數學運算式或子查詢,視圖將不支援INSERT,也不支援UPDATE使用了數學運算式、子查詢的欄位值
    • 在定義視圖的SELECT語句後的欄位清單中使用DISTINCT、彙總函式、GROUP BY、HAVING、UNION等,視圖將不支持INSERT、UPDATE、DELETE
    • 在定義視圖的SELECT語句中包含了子查詢,而子查詢中引用了FROM後面的表,視圖將不支援INSERT、UPDATE、DELETE
    • 視圖定義基於一個不可更新視圖
    • 常量視圖

刪改視圖

-- 修改方法1
CREATE OR REPLACE VIEW 視圖名稱
AS
-- ...查詢語句

-- 修改方法2
ALTER VIEW 視圖名稱
AS
-- ...查詢語句

-- 刪除
DROP VIEW IF EXISTS 視圖名稱

小結

  • 視圖的優點:

    • 簡化操作:能夠分解複雜的查詢操作

    • 減少冗餘:本身不儲存資料

    • 安全性:可以達成某種隔離

  • 如果基表的資料結構改變,還需要手動維護視圖;如果有嵌套使用視圖那就更慘,要慎用


上次修改於 2021-12-25