視圖是由SELECT查詢語句所定義的一個虛擬表,是查看數據的一種很是有效的方式。視圖包含一系列帶有名稱的數據列和數據行,但視圖中的數據並不真實存在於數據庫中,視圖返回的是結果集。java
視圖是存儲在數據庫中的查詢的SQL語句,建立視圖主要出於兩種緣由:
A、實現安全。視圖可設置用戶對視圖的訪問權限。
建立查詢是JAVA班學生成績的視圖javaview、NET班學生成績的視圖netview,受權java可以訪問javaview視圖,受權net能夠訪問netview視圖。數據庫
create view javaview as select a.StudentID,a.sname,email,c.subJectName,a.class,b.mark from TStudent a join TScore b on a.StudentID=b.StudentID join TSubject c on b.subJectID=c.subJectID where a.class='JAVA'; create view netview as select a.StudentID,a.sname,email,c.subJectName,a.class,b.mark from TStudent a join TScore b on a.StudentID=b.StudentID join TSubject c on b.subJectID=c.subJectID where a.class='NET';
受權java用戶訪問 schoolDB.javaview視圖grant select on schoolDB.javaview to 'java'@'%' identified by '123456';
受權net用戶訪問 schoolDB.netview視圖grant select on schoolDB.netview to 'net'@'%' identified by '123456';
使用SQL Manager客戶端鏈接數據庫時,java、net用戶分別能夠訪問javaview視圖和netview視圖。
B、隱藏數據複雜性。視圖能夠隱藏一些數據,如:社會保險基金錶,能夠用視圖只顯示姓名,地址,而不顯示社會保險號和工資數等。視圖就像一個視口,從視口中只能看到過濾後的某些數據列。安全
A、視圖能簡化用戶操做
視圖機制使用戶能夠將注意力集中在所關心地數據上。若是數據不是直接來自基本表,則能夠經過定義視圖,使數據庫看起來結構簡單、清晰,而且能夠簡化用戶的的數據查詢操做。例如,定義了若干張錶鏈接的視圖,就將表與表之間的鏈接操做對用戶隱藏。用戶所做的只是對一個虛表的簡單查詢,而虛表是怎樣得來的,用戶無需瞭解。
B、視圖使用戶能以多種角度看待同一數據
視圖機制能使不一樣的用戶以不一樣的方式看待同一數據,當許多不一樣種類的用戶共享同一個數據庫時。
C、視圖對重構數據庫提供了必定程度的邏輯獨立性
數據的物理獨立性是指用戶的應用程序不依賴於數據庫的物理結構。數據的邏輯獨立性是指當數據庫重構造時,如增長新的關係或對原有的關係增長新的字段,用戶的應用程序不會受影響。層次數據庫和網狀數據庫通常能較好地支持數據的物理獨立性,而對於邏輯獨立性則不能徹底的支持。
在關係數據庫中,數據庫的重構造每每是不可避免的。重構數據庫最多見的是將一個基本表「垂直」地分紅多個基本表。例如:將學生關係student(sid,sname,sex,age,dept,leader),分爲studentinfo(sid,sname,sex,age)和deptinfo(sid,dept)兩個關係。原表student爲studentinfo表和deptinfo表天然鏈接的結果。若是創建一個視圖student:網絡
CREATE VIEW student(sid,sname,sex,age,dept) AS SELECT studentinfo.sid,studentinfo.sname,studentinfo.sex,studentinfo.age, deptinfo.dept FROM studentinfo, deptinfo WHERE studentinfo.sid=deptinfo.sid;
儘管數據庫的邏輯結構變爲studentinfo和deptinfo 兩個表,但應用程序沒必要修改,由於新創建的視圖定義爲用戶原來的關係,使用戶的外模式保持不變,用戶的應用程序經過視圖仍然可以查找數據。
視圖只能在必定程度上提供數據的邏輯獨立,好比因爲視圖的更新是有條件的,所以應用程序中修改數據的語句可能仍會由於基本表構造的改變而改變。
D、視圖可以對機密數據提供安全保護
在設計數據庫應用系統時,能夠對不一樣的用戶定義不一樣的視圖,使機密數據不出如今不該該看到機密數據的用戶視圖上。如student表涉及全校15個院系學生數據,能夠在其上定義15個視圖,每一個視圖只包含一個院系的學生數據,並只容許每一個院系的主任查詢和修改本原系學生視圖。
E、適當的利用視圖能夠更清晰地表達查詢
例如常常須要執行這樣的查詢「對每一個學生找出他得到最高成績的課程號」。能夠先定義一個視圖,求出每一個同窗得到的最高成績。數據結構
CREATE VIEW viewname(列1,列2...) AS SELECT (列1,列2...) FROM ...;
建立學生信息的視圖:ide
create view studentview as select studentID, sname, sex from TStudent;
視圖的使用和普通表同樣。select * from studentview;
不能在一張由多張關聯錶鏈接而成的視圖上作同時修改兩張表的操做;
視圖與表是一對一關係狀況:若是沒有其它約束(如視圖中沒有的字段,在基本表中是必填字段狀況),能夠進行增刪改數據操做。.net
drop view studentview;
計算機網絡
若是視圖的基表是一張表,能夠經過視圖向基表插入記錄,要求視圖中的沒有的列容許爲空。
A、經過視圖插入數據到表insert into studentview(studentID, sname, sex)VALUES('01001', '孫悟空', '男');
查詢插入的記錄,能夠看到經過視圖沒有的列,值爲空或默認值。
B、經過視圖刪除表中記錄
視圖的基表只能有一張表,若是有多張表,將不知道從哪一張表刪除。delete from studentview where studentid='01001';
C、經過視圖修改表中記錄
只能修改視圖中有的列。update studentview set sname='孫悟空' where studentid='00001';
設計
查看視圖的信息code
describe viewname; desc scoreview;
查看全部的表和視圖show tables;
查看視圖的信息show fields from scoreview;
CREATE OR REPLACE VIEW viewname AS SELECT [...] FROM [...]; alter view studentview as select studentID as 學號, sname as 姓名, sex as 性別 from TStudent;
若是在建立視圖的時候指定了「WITH CHECK OPTION」,更新數據時不能插入或更新不符合視圖限制條件的記錄。
建立視圖的查詢的表稱爲基表,基表能夠是視圖和表。
create view sview as select studentID, sname, sex from studentview where studentID>990 and sex='男';
建立一個視圖,視圖包含學生 學號、姓名、學科和成績。
create view view1 as select a.StudentID,a.Sname,c.subJectName,b.mark from TStudent a join TScore b on a.StudentID=b.StudentID join TSubject c on b.subJectID=c.subJectID;
建立成績視圖,包含學號、姓名、計算機網絡課程成績、數據結構成績、JAVA開發成績。
create view scoreview as select studentid 學號,sname 姓名, AVG(case subjectname when '計算機網絡' then mark END) 計算機網絡, AVG(case subjectname when '數據結構' then mark END) 數據結構, AVG(case subjectname when 'JAVA開發' then mark END) JAVA開發 from view1 group by 學號;