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