實驗5 視圖的創建及應用
1、實驗目的
(1)掌握使用T-SQL語言創建、修改視圖;
(2)掌握使用T-SQL語句刪除、重命名視圖;
(3)掌握使用T-SQL語句,通過視圖對基本表進行數據操作;
(4)掌握使用界面操作的方式創建、修改、刪除和重命名視圖,以及通過視圖對基本表進行數據操作的方法。
2、實驗類型
驗證型、設計型。
3、相關知識
視圖是一種數據庫對象,是關系數據庫系統提供給用戶以多種角度觀察數據庫中數據的重要機制。視圖是從一個或者多個數據表或視圖中導出的虛表,視圖的結構和數據是對數據表進行查詢的結果。
(1)使用T-SQL語句創建視圖的語法格式
CREATE VIEW [ < owner > .] view_name [ ( column_name [ ,...n ] ) ]
[WITH ENCRYPTION]
AS
select_statement
FROM table_name WHERE search_condition
[WITH CHECK OPTION]
其中:
n view_name:為新創建的視圖指定的名字,視圖名稱必須符合標識符規則。
n column_name:在視圖中包含的列名,也可以在SELECT 語句中指定列名。
n table_name:視圖基表的名字。
n select_statement:選擇哪些列進入視圖的SELECT語句。
n WHERE search_condition:基表數據進入視圖所應滿足的條件
n WITH CHECK OPTION:迫使通過視圖執行的所有數據修改語句必須符合視圖定義中設置的條件。
n WITH ENCRYPTION:對視圖的定義進行加密。
創建視圖時的注意事項:
- 在CREATE VIEW語句中,不能包括ORDER BY、COMPUTE或者COMPUTE BY 子句,也 不能出現INTO關鍵字。
- 創建視圖所參考基表的列數最多為1024列。
- 創建視圖不能參考臨時表。
- 在一個批處理語句中,CREATE VIEW語句不能和其他Transact-SQL語句混合使用。
- 盡量避免使用外連接創建視圖。
(2)使用T-SQL語句管理視圖
n 使用系統存儲過程查看視圖信息:
- SP_HELP 數據庫對象名稱
- SP_HELPTEXT 視圖(觸發器、存儲過程)
- SP_DEPENDS 數據庫對象名稱
n 用DROP VIEW語句刪除視圖
DROP VIEW view_namel,view_name2,…
n 使用系統存儲過程重命名視圖
SP_RENAME old_view_name,new_view_name
(3)使用T-SQL語句修改視圖
ALTER VIEW view_name
[(column[,...n])]
[WITH ENCRYPTION]
AS
select_statement
[ WITH CHECK OPTION ]
其中:
n view_name:被修改的視圖的名字。
n column_name:在視圖中包含的列名。
n WITH CHECK OPTION:迫使通過視圖進行數據修改的所有語句必須符合視圖定義中設置的條件。
n table_name:視圖基表的名字。
n WITH ENCRYPTION:對包含創建視圖的SQL腳本進行加密。
(4)使用T-SQL語句對視圖數據的查詢、插入、修改與刪除
用T-SQL語句對視圖數據的查詢、插入、修改與刪除的語法格式和對表中數據的查詢、插入、修改與刪除的操作幾乎一樣。
修改視圖數據的限制:
n 無論是視圖的創建、修改、刪除還是視圖數據的查詢、插入、更新、刪除都必須由具有權限的用戶進行。
n 對由多個表連接成的視圖修改數據時,不能同時影響一個以上的基礎表,也不允許刪除視圖中的數據。
n 對視圖上的某些列不能進行修改。這些列是:計算值、內置函數和行集合函數。
n 對具有NOT NULL的列進行修改時可能會出錯。在通過視圖修改或插入數據時,必須保證未顯示的具有NOT NULL屬性的列有值,可以是缺省、IDENTITY等,否則不能向視圖中插入數據行。
n 如果某些列因為規則或者約束的限制而不能接受從視圖插入數據的時候,則插入數據可能會失敗。
n 刪除基礎表並不刪除視圖。建議采用與表明顯不同的名字命名視圖。
4、實驗內容及指導
【實驗5-1】: 基於BOOK表創建一個視圖BOOKVIEW1,輸出bno、bname、bpc、author,然后通過視圖查詢圖書信息。
USE JXGL
GO
CREATE VIEW BOOKVIEW1
AS SELECT bno,bname,Bpc,author
FROM BOOK
GO
SELECT * FROM BOOKVIEW1
【實驗5-2】:基於BOOK表創建一個出版社為“清華大學出版社”的視圖BOOKVIEW2,輸出bno、bname、author、price,然后通過視圖查詢圖書信息。
USE JXGL
GO
CREATE VIEW BOOKVIEW2
AS SELECT bno, bname, author,price
FROM BOOK WHERE pbc=’清華大學出版社’
GO
SELECT * FROM BOOKVIEW2
【實驗5-3】: 基於BOOK表創建一個清華大學出版社出版,圖書定價排在前五名的視圖BOOKVIEW3,輸出bno、bname、author,然后通過視圖查詢圖書信息。
USE JXGL
GO
CREATE VIEW BOOKVIEW3
AS SELECT TOP 5 bno,bname,author
FROM BOOK WHERE pbc=’清華大學出版社’
ORDER BY price DESC
GO
SELECT * FROM BOOKVIEW3
【實驗5-4】: 基於BOOK表創建一個顯示出版社、圖書平均定價及圖書種類數的視圖BOOKVIEW4,輸出“出版社”、“平均定價”、“圖書種類數”,然后通過視圖查詢“清華大學出版社”的數據信息。
USE JXGL
GO
CREATE VIEW BOOKVIEW4
AS SELECT pbc 出版社, AVG(price) 平均定價, COUNT(bno) 圖書種類數
FROM BOOK
GROUP BY pbc
GO
SELECT *
FROM BOOKVIEW4
WHERE 出版社=‘清華大學出版社’
【實驗5-5】:建立所有正在被選作為教材的圖書信息的視圖BOOKVIEW5,輸出“課程號”、“課程名”、“學分”,“書名”、“作者”和“出版社”。
USE JXGL
GO
Create view Bookview5 AS select cno 課程號, cname 課程名,
credit 學分,bname 書名,author 作者, pbc 出版社
from BOOK,C Where BOOK.bno=C.bno
【實驗5-6】:基於【實驗5-5】創建視圖BOOKVIEW6,輸出“課程名”和“書名”,並通過該視圖查看課程教材選用信息。
USE JXGL
GO
CREATE VIEW BOOKVIEW6
AS SELECT 課程名, 書名
FROM BOOKVIEW5
GO
SELECT * FROM BOOKVIEW6
【實驗5-7】:基於【實驗5-5】創建的視圖BOOKVIEW5進行修改,輸出“課程名”、“書名”和“出版社”,並對視圖加密。
USE JXGL
GO
ALTER VIEW BOOKVIEW5 WITH ENCRYPTION
AS SELECT cname 課程名, bname 書名, pbc 出版社
FROM BOOK,C
WHERE BOOK.bno=C.bno
【實驗5-8】:查看視圖BOOKVIEW5的定義。
USE JXGL
GO
SP_HELPTEXT BOOKVIEW5
【實驗5-9】:將視圖BOOKVIEW5重新命名為BVIEW5。
USE JXGL
GO
SP_RENAME ‘BOOKVIEW5’, ‘BVIEW5’
【實驗5-10】:基於【實驗5-8】,將視圖BVIEW5刪除。
USE JXGL
GO
DROP VIEW BVIEW5
【實驗5-11】:通過【實驗5-1】創建的視圖BOOKVIEW1,向BOOK表插入一行數據信息(‘b101’,’數據庫系統’,’高等教育出版社’,’丁寶康’)
USE JXGL
GO
INSERT INTO BOOKVIEW1(bno,bname,bpc,author)
VALUES (‘b101’,’數據庫系統’,’高等教育出版社’,’丁寶康’)
注:當視圖只輸出基本表的部分列時,通過視圖插入數據可能會遇到問題:視圖沒有顯示的列可能沒有設置NULL特性,也沒有設置缺省值,而通過視圖無法對沒有出現的列向基表插入數據,因而會導致數據插入失敗;如果視圖沒有顯示的列設置了NULL特性或設置了默認值,則可以通過視圖向基表成功插入數據,如【實驗5-11】。
【實驗5-12】:通過【實驗5-2】創建的視圖BOOKVIEW2,把清華大學出版社的圖書定價更新為原定價的八折,然后通過視圖查詢圖書信息。
USE JXGL
GO
UPDATE BOOKVIEW2
SET price=0.8*price
GO
SELECT *
FROM BOOKVIEW2
【實驗5-13】:通過【實驗5-1】創建的視圖BOOKVIEW1,把所有高等教育出版社的圖書信息刪除。
USE JXGL
GO
DELETE FROM BOOKVIEW1
WHERE bpc=’高等教育出版社’
GO
SELECT * FROM BOOKVIEW1
5、實驗作業
(1)基於S表創建一個名為SVIEW1的視圖,輸出sno、sname、sex、birth、homadd,然后通過該視圖查詢學生信息;
(2)基於S表創建一個男同學的名為SVIEW2的視圖,輸出sno、sname、homadd,然后通過該視圖查詢男生信息;
(3)基於DEPT表創建一個學生人數排在前五名的視圖DEPTVIEW1,輸出dno、dname、dheader,然后通過視圖查詢系信息數據;
(4) 基於S和SC表創建一個按系別分組顯示,選修課程考試平均成績的視圖SVIEW3,輸出“系號”、“平均成績”,然后通過視圖查詢’04’系的數據信息;
(5)基於S、C和SC創建一個聯合視圖SVIEW4,要求輸出“學號”、“姓名”、“課程名”、“學分”、“總學時”、“成績”和“選修學期”;
(6)基於(5)中的視圖SVIEW4創建視圖SVIEW5,要求輸出“姓名”、“課程名”和“成績”;並通過視圖SVIEW5查詢“數據庫原理”課程的選修信息;
(7)基於(5)中創建的視圖SVIEW4進行修改,要求輸出“姓名”、“課程名”和“成績”;並對該視圖進行加密;
(7)查看視圖的定義;
(8)將視圖SVIEW5重新命名為STUVIEW5;
(9)將視圖STUVIEW5刪除;
(10)通過(1)中創建的名為SVIEW1的視圖,向S表中插入數據(’15043102’,’蘭一飛’,’男’,’1993-11’,’北京市通州區焦王庄’);
(11)通過SVIEW1將(10)中插入的學號為115043102的學生姓名更新為“蘭飛”;
(12)通過(1)中創建的名為SVIEW1的視圖,刪除所有男同學的信息。
6、實驗總結
(1)實驗內容的完成情況;
(2)對重點實驗結果進行分析;
(3)出現的問題;
(4)解決方案(列出遇到的問題和解決方法,列出沒有解決的問題);
(5)收獲和體會。
作業
use JXGL; go create view SVIEW1 as select sno,sname,sex,birth,homadd from S go select * from SVIEW1 go create view SVIEW2 as select sno,sname,homadd from S where sex = '男' go select * from SVIEW2 go create view DEPTVIEW1 as select top 5 dno,dname,dheader from DEPT order by snum desc select * from DEPTVIEW1 go create view SVIEW3 as select dno,AVG(SC.grade) as avggrede from S,SC where dno='D04' group by dno select * from SVIEW3 go create view SVIEW4 as select S.sno,S.sname,C.cname,C.credit,C.tperiod,SC.grade,SC.time from S,SC,C where S.sno = SC.sno and SC.cno = C.cno group by S.sno,S.sname,C.cname,C.credit,C.tperiod,SC.grade,SC.time select * from SVIEW4 go create view SVIEW5 as select sname,cname,grade from SVIEW4 select * from SVIEW5 where cname='數據庫原理' go alter view SVIEW4 with encryption as select sname,cname,grade from S,SC,C where S.sno = SC.sno and SC.cno = C.cno go SP_HELPTEXT SVIEW5 go SP_RENAME 'SVIEW5', 'STUVIEW5' go drop view STUVIEW5