iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
3
自我挑戰組

網頁服務開發之路系列 第 18

Day18. MySQL: View 的應用

學習來源: CodeData - MySQL 超新手入門(11)Views

-「View」元件是一種「虛擬表格」,使用起來就像是一個表,可以 用來保存一段你指定的查詢敘述

建立需要的View

不論是為了查詢或維護,如果你很常需要使用到同一個查詢敘述,你就可以考慮建立一個View元件把這個查詢敘述儲存起來,語法:
sql CREATE VIEW View名稱 AS SELECT ... FROM ... WHERE ...

  • 如果要加入新的欄位,語法:
    CREATE OR REPLACE VIEW View名稱 AS
    SELECT 新的欄位, ...
    FROM ...
    
  1. DESC View名稱 (「DESCRIBE」or「DESC」): 查詢 View 元件中會傳回哪些欄位的資料
  2. 關於 建立View元件 的規定
    1. 在同一個資料庫中,View 的名稱不可以重複,也不可以跟表格名稱一樣
    2. View 不可以跟 Triggers 建立聯結
  3. View查詢敘述 的規定
    1. 查詢敘述中只能使用到已存在的表格或View
    2. 「FROM」子句中不可以使用子查詢
    3. 不可以使用「TEMPORARY」表格
    4. 不可以使用自行定義的變數、Procedure 與 Prepared statement 參數
  4. 結合查詢中,為不同的兩個欄位取一樣的名稱
    1. 敘述的「SELECT」子句中,自己為名稱重複的欄位取不同的欄位別名
    2. 建立View元件的時候,另外指定View元件的欄位名稱
    CREATE OR REPLACE VIEW View名稱
    (欄位新名稱1, 欄位新名稱2)
    AS
    SELECT co.Name, ci.Name ...
    

修改View

  1. 「ALTER VIEW」語法:
    ALTER VIEW View名稱
    (新欄位名稱, 欄位1, 欄位2, 欄位3)
    AS 新欄位, 欄位1, 欄位2, 欄位3
    FROM ...
    
  2. 使用「CREATE OR REPLACE VIEW」敘述也可以。兩者差異在於 View 元件存不存在,如果不存在,CREATE OR REPLACE VIEW 會建立新的 View

刪除View

「DROP VIEW」敘述加入「IF EXISTS」,這樣就可以防止產生View元件不存在的錯誤訊息

DROP VIEW IF EXISTS CountryMax

資料維護與View

  1. 使用View元件來執行新增、修改或刪除的工作,也可以增加資料維護的方便性。
  2. 要使用View元件來執行新增、修改或刪除的工作,View元件所包含的查詢敘述必須符合下列的規則:
    1. 不可以包含計算或函式的欄位
    2. 只允許一對一的結合查詢
    3. View元件的「ALGORITHM」不可以設定為「TEMPTABLE」
      符合上列規定的View元件,就會稱為「可修改的View元件、updattable views」。只有可修改的View元件,可以使用在「INSERT」、「UPDATE」或「DELETE」敘述中執行資料維護的工作。

使用View元件執行資料維護

假設
sql CREATE VIEW cmdev.EmpDept30View AS SELECT empno, ename, job, manager, hiredate, salary, comm FROM cmdev.emp WHERE deptno = 30

  1. 「UPDATE」: 要修改員工編號「7844」的佣金為600
    UPDATE EmpDept30View
    SET    comm = 600
    WHERE  empno = 30
    
    1. 查詢View元件或表格,都可以確定資料已經修改了
  2. 「INSERT」:
    INSERT INTO EmpDept30View
    VALUES (9001, 'SIMON', 'SALESMAN', 7698, '2000-04-01', 1000, 250)
    
    1. 查詢View元件所得到的結果並沒有剛才新增的員工資料,查詢表格時才可以確定資料已經新增,這是因為新增紀錄的部門編號欄位資料為「NULL」的關係
  3. 「DELETE」:
    DELETE FROM EmpDept30View WHERE empno = 9001
    
    1. 當這個 VIEW 元件查詢條件本來就沒有 編號9001的員工,所以刪除敘述並沒有刪除任何資料

使用「WITH CHECK OPTION」

  1. 使用View元件來執行資料維護的工作,可能會造成一些有問題的資料。
  2. 加入「WITH CHECK OPTION」設定的View元件,在執行資料維護工作時,會先執行檢查的工作,規則是一定要符合「View元件中WHERE設定的條件」
    CREATE VIEW cmdev.EmpDept30View AS
    SELECT empno, ename, job, manager, hiredate, salary, comm
    FROM   cmdev.emp
    WHERE  deptno = 30
    WITH [CASCADE | LOCAL] CHECK OPTION
    
    1. 「CASCADE」: 預設設定,檢查全部的VIEW
    2. 「LOCAL」: 檢查限制於目前的VIEW
  3. 會有「CASCADE」和「LOCAL」這兩個設定的原因,是因為View元件的資料來源可以一個表格,也可以是一個View元件

View的演算法

View的維護與資訊

如果不小心刪除「!EmpSalaryView」這個View元件,執行查詢「EmpDept20View」的時候,就會產生警告訊息

  1. 檢驗View的正確性
    1. CHECK TABLE 表格 或 View名稱,可以發現 EmpDept20View是有問題的 View
  2. 取得View的相關資訊
    1. 特別的資料庫,名稱是「information_schema」,有一個表格叫作「VIEWS」,它儲存所有MySQL資料庫中View元件的相關資訊
      SELECT TABLE_SCHEMA, TABLE_NAME, VIEW_DEFINITION, CHECK_OPTION, IS_UPDATABLE
      FROM information_schema,VIEWS
      

上一篇
Day17. MySQL: 子查詢
下一篇
Day19. MySQL: Prepared Statement
系列文
網頁服務開發之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言