視圖無非是存儲在數(shù)據(jù)庫中的相關名稱的SQL語句。視圖實際上是一個表中的預定義的SQL查詢形式的組合物。
視圖可以包含一個表中的所有行或從表中選擇部分行。視圖可以從一個或多個表取決于書面SQL查詢來創(chuàng)建。
視圖是一種虛擬表,讓用戶做到以下幾點:
用戶或用戶類別的找到天然或直觀的結(jié)構(gòu)數(shù)據(jù)的方式。
限制訪問的數(shù)據(jù),使得用戶可以看到,(有時)修改確實需要或不需要更多。
匯總可從表中的數(shù)據(jù)生成各種報告。
使用CREATE VIEW語句創(chuàng)建數(shù)據(jù)庫視圖。 視圖可以從一個單一的表,多個表或另一視圖中創(chuàng)建。
要創(chuàng)建視圖,用戶必須根據(jù)具體的實施有相應的系統(tǒng)權限。
CREATE VIEW基本的語法如下:
CREATE VIEW view_name AS SELECT column1, column2..... FROM table_name WHERE [condition];
可以包括在正常使用的SQL SELECT查詢類似的方式,在SELECT語句中的多個表。
考慮CUSTOMERS表具有以下記錄:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
現(xiàn)在,下面的例子創(chuàng)建客戶表的視圖。這個視圖將用于從CUSTOMERS表讀取客戶姓名和年齡:
SQL > CREATE VIEW CUSTOMERS_VIEW AS SELECT name, age FROM CUSTOMERS;
現(xiàn)在,你可以查詢CUSTOMERS_VIEW類似的方式來查詢實際的表。 下面是一個例子:
SQL > SELECT * FROM CUSTOMERS_VIEW;
這將產(chǎn)生以下結(jié)果:
+----------+-----+ | name | age | +----------+-----+ | Ramesh | 32 | | Khilan | 25 | | kaushik | 23 | | Chaitali | 25 | | Hardik | 27 | | Komal | 22 | | Muffy | 24 | +----------+-----+
WITH CHECK OPTION是CREATE VIEW語句選項。WITH CHECK OPTION的目的是為了確保所有更新和插入滿足視圖定義的條件。
如果它沒有滿足條件,在UPDATE或INSERT返回一個錯誤。
以下是創(chuàng)建CUSTOMERS_VIEW 視圖例子使用WITH CHECK OPTION:
CREATE VIEW CUSTOMERS_VIEW AS SELECT name, age FROM CUSTOMERS WHERE age IS NOT NULL WITH CHECK OPTION;
在這種情況下,WITH CHECK OPTION拒絕任何NULL值條目在視圖的AGE列,因為該視圖由數(shù)據(jù)定義的不能在AGE欄中有NULL值。
視圖在一定條件下可以更新:
SELECT子句不包含關鍵字DISTINCT。
SELECT子句不包含匯總函數(shù)。
SELECT子句不包含集合函數(shù)。
SELECT子句不能包含集合運算符。
SELECT子句不能包含一個ORDER BY子句。
FROM子句中不能包含多個表。
WHERE子句不能包含子查詢。
查詢不包含GROUP BY或HAVING。
計算列無法更新。
從基表中的所有NOT NULL列必須包含在視圖是為了使用INSERT查詢功能。
所以,如果一個視圖滿足所有上述規(guī)則,那么就可以更新視圖。下面是一個例子,更新Ramesh的年齡:
SQL > UPDATE CUSTOMERS_VIEW SET AGE = 35 WHERE name='Ramesh';
這最終將更新基礎表CUSTOMERS,并同樣在視圖中反映。現(xiàn)在,試著查詢基礎表,SELECT語句將產(chǎn)生如下結(jié)果:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 35 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 |<