mysql中视图的概念_MySql中的视图的概念及应用
視圖的基本概念
視圖是從一個或幾個基本表(或者視圖)導出的表。它與基本表不同,是一個虛表。
數據庫只存放視圖的定義,而不存放視圖對應的數據,這些數據仍存放在原來的基本表中。所以基本表中的數據發生變化,從視圖中查詢出的數據也就隨之改變了。
視圖一經定義,就可以和基本表一樣被查詢、被刪除。也可以在一個視圖之上再定義新的視圖,但對視圖的更新(增、刪、改)操作則有一定的限制。
視圖的優點
視圖相比基本表有以下優點:
1.視圖能夠簡化用戶的操作
視圖機制用戶可以將注意力集中在所關心的數據上。如果這些數據不是直接來自基本表,則可以通過定義視圖,使數據庫看起來結構簡單、清晰,并且可以簡化用戶的數據查詢操作。
2.視圖是用戶能以不同的角度看待同樣的數據。
對于固定的一些基本表,我們可以給不同的用戶建立不同的視圖,這樣不同的用戶就可以看到自己需要的信息了。
3.視圖對重構數據庫提供了一定程度的邏輯性。
比如原來的A表被分割成了B表和C表,我們仍然可以在B表和C表的基礎上構建一個視圖A,而使用該數據表的程序可以不變。
4.視圖能夠對機密數據提供安全保護
比如說,每們課的成績都構成了一個基本表,但是對于每個同學只可以查看自己這門課的成績,因此可以為每個同學建立一個視圖,隱藏其他同學的數據,只顯示該同學自己的數據。
5.適當的利用視圖可以更加清晰的表達查詢
有時用現有的視圖進行查詢可以極大的減小查詢語句的復雜程度。
說明:本文章中的用來作為示例的數據表有三個:student、course、sc 數據表具體請看:Mysql數據庫中的EXISTS和NOT EXISTS
建立視圖
SQL視圖建立命令
CREATE VIEW [([,]…)]
AS
[WITH ?CHECK ?OPTION];
其中,子查詢可以是任意復雜的SELECT語句,但通常不允許包含ORDER BY子句和DISTINCT短語(因為子查詢是中間結果)。
組成視圖的屬性列名可以
全部省略或全部指定,如果省略,則隱含由子查詢中SELECT目標列中的諸字段組成;
但在下列情況下必須明確指定視圖的所有列名:
(1)某個目標列不是單純的屬性名,而是聚集函數或列表達式,或者目標列為*
(2)多表連接時選出了幾個同名列作為視圖的字段
(3)需要在視圖中為某個列啟用新的更合適的名字
RDBMS執行CREATE VIEW語句時只是把視圖的定義存入數據字典,并不執行其中的SELECT語句。在對視圖查詢時,按視圖的定義從基本表中將數據查出。
建立的視圖可以簡單的分為以下三類:
行列子集視圖
若一個視圖是從單個基本表導出的,并且只是去掉了基本表的某些行和某些列,但保留了主碼,我盟稱這類視圖為行列子集視圖
例子1.1
建立信息系學生的視圖
SQL語句:
CREATE VIEW IS_Student
AS SELECT Sno, Sname, Sage FROM Student WHERE Sdept= 'IS' 本例中省略了視圖IS_Student的列名,隱含了由子查詢中SELECT子句中的三個列名組成。
WITH CHECK OPTION表示對視圖進行UPDATE、INSERT和DELETE操作時要保證更新、插入或刪除的行滿足視圖定義中的謂詞條件(即子查詢中的條件表達式)
例子1.2
建立信息系學生的視圖,并要求透過該視圖進行的更新操作只涉及信息系學生
SQL語句:
CREATE VIEW IS_Student
AS SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept= 'IS'
WITH CHECK OPTION;
由于在定義IS_Student視圖時加上了WITH CHECK OPTION子句,以后對該視圖進行插入、修改和刪除操作時,RDBMS會自動加上Sdept='IS'的條件:
插入操作:DBMS自動檢查Sdept屬性值是否為'IS'
如果不是,則拒絕該插入操作
如果沒有提供Sdept屬性值,則自動定義Sdept為'IS'
修改操作:DBMS自動加上Sdept= 'IS'的條件
刪除操作:DBMS自動加上Sdept= 'IS'的條件
視圖不僅可以建立在單個基本表上,也可以建立在多個基本表上,或者建立在基本表和視圖的基礎上。
例子1.3 建立信息系選修了1號課程的學生視圖
CREATE VIEW IS_S1(Sno, Sname, Grade)
AS SELECT Student.Sno, Sname, Grade
FROM Student, SC
WHERE Sdept= 'IS' AND
Student.Sno=SC.Sno AND
SC.Cno= '1';
例子1.4建立信息系選修了1號課程且成績在90分以上的學生的視圖
CREATE VIEW IS_S2
AS SELECT Sno, Sname, Grade
FROM IS_S1
WHERE Grade>=90;
帶表達式的視圖
定義基本表時,為了減少數據庫中的冗余數據,表中只存放基本數據,由基本數據經過各種計算派生出的數據一般是不存儲的。
但由于視圖中的數據并不實際存儲,所以定義視圖時可以根據應用的需要,設置一些派生屬性列。
這些派生屬性列由于在基本標中并不實際存在也稱他們為
虛擬列,帶虛擬列的視圖也稱為
帶表達式的視圖
例子2.1?定義一個反映學生出生年份的視圖
CREATE VIEW BT_S(Sno, Sname, Sbirth)
AS SELECT Sno, Sname, 2000-Sage
FROM Student;
分組視圖
還可以用帶有聚集函數和GROUP BY子句的查詢來定義視圖,這種視圖稱為分組視圖。
例子3.1將學生的學號及他的平均成績定義為一個視圖
CREATE VIEW S_G(Sno, Gavg)
AS SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno;
由于AS子語句中SELECT語句語句的目標列平均成績是通過作用聚集函數得到的,所以CREATE VIEW中必須明確定義組成S_G視圖的每個屬性列名,S_G是一個分組視圖。
例子3.2將Student表中所有女生記錄定義為一個視圖
CREATE VIEW F_Student1(stdnum, name, sex, age, dept)
AS SELECT * FROM Student WHERE Ssex='女';
這里的視圖F_Student1是由子查詢“SELECT *”建立的,需要明確定義組成F_Student1視圖的每個屬性列名。
查詢視圖
視圖定義以后,用戶就可以像查詢基本表一樣查詢視圖了。
因此從用戶角度看,查詢視圖與查詢基本表相同。
不過,所有對視圖的查詢,都會被數據庫管理軟件解釋成對基本數據表的查詢,因為視圖是在基本表的基礎上抽象出來的。
例子4.1在信息系學生的視圖中找出年齡小于20歲的學生
SELECT Sno, Sage
FROM IS_Student
WHERE Sage<20;
IS_Student視圖的定義(視圖定義例1):
CREATE VIEW IS_Student
AS SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept= 'IS';
DBMS轉換后的查詢語句為:
SELECT Sno, Sage
FROM Student
WHERE Sdept='IS' AND Sage<20;
更新視圖
更新視圖是指通過視圖插入、刪除和修改數據。
由于視圖是不實際存儲數據的虛表,因此對視圖的更新最終要轉換為對基本表的更新。
從用戶角度看,更新視圖與更新基本表相同;RDBMS將之轉化為對基本表的更新操作。
為防止用戶通過視圖對數據進行更新時,有意無意地對不屬于視圖范圍內的基本表數據進行操作,可以在定義視圖時加上WITH CHECK OPTION子句。
這樣在視圖上增刪改數據時,RDBMS會檢查視圖定義中的條件,若不滿足條件,則拒絕執行該操作。
例子5.1將信息系學生視圖IS_Student中學號95002的學生姓名改為“劉辰”
UPDATE IS_Student
SET Sname='劉辰'
WHERE Sno='95002';
轉換后的語句:
UPDATEStudent
SET Sname='劉辰'
WHERE Sno='95002' AND Sdept='IS';
在關系數據庫中,并不是所有的視圖都是可更新的,因為有些視圖的更新不能唯一地有意義地轉換成對相應基本表的更新。
一般地,
行列子集視圖是可更新的,除此之外,還有一些視圖理論上是可更新的,但他們的確切特征還是尚待研究的課題,還有些視圖從理論上就是不可更新的。
刪除視圖
刪除視圖的語句格式:DROP VIEW ;
刪除視圖對生成視圖的基本表沒有任何影響。
刪除基表時,由該基表導出的所有視圖定義沒有被刪除,但已不能使用,必須使用DROP VIEW顯式刪除。
例子6.1
刪除視圖BT_S:
DROP VIEW BT_S;
刪除視圖IS_S1:
DROP VIEW IS_S1;
總結
以上是生活随笔為你收集整理的mysql中视图的概念_MySql中的视图的概念及应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个TextView使用不同的颜色
- 下一篇: linux中mysql与eclipse_