實驗3 SQL語言—更新操作、視圖、索引等操作
實驗目的要求
-
熟悉數據庫的數據更新操作,能夠使用SQL語句對數據庫進行數據的插入、修改、刪除操作。
-
熟悉SQL語言有關視圖的操作,能夠熟練使用SQL語句來創建需要的視圖,定義數據庫外模式,並能使用所創建的視圖實現數據管理。
-
掌握索引設計原則和技巧,能夠創建合適的索引以提高數據庫查詢。
實驗主要內容
-
針對SQL Server數據庫設計單元組插入、批量數據插入、修改數據和刪除數據等SQL語句。理解和掌握INSERT、UPDATE和DELETE語法結構的各個組成成分,結合嵌套SQL子查詢,分別設計幾種不同形式的插入、修改和刪除數據的語句,並調試成功。
-
針對給定的數據庫模式,以及相應的應用需求,創建視圖、創建帶WITH CHECK OPTION的視圖,並驗證視圖WITH CHECK OPTION選項的有效性。理解和掌握視圖消解執行原理,掌握可更新視圖和不可更新視圖的區別
-
針對給定的數據庫模式和具體應用需求,創建唯一索引、函數索引、復合索引等;修改索引;刪除索引。設計相應的SQL查詢驗證索引有效性。
實驗儀器設備
- 學生每個一台PC
- 已安裝SQL Server環境
實驗記錄
數據更新操作
單元組插入
--向圖書表中插入一條單元組數據('B6','信息論','28.2')
INSERT
INTO 圖書(BNO,BNAME,PRICE)
VALUES('B6','信息論','28.2');
批量數據插入
--子查詢嵌套在INSERT語句中用以插入批量數據
CREATE TABLE LNTE
(LNO NCHAR(10) PRIMARY KEY,
TEL INT); --創建一個新的LNAME-TEL表
--從圖書館表中選擇LNO和TEL兩列數據批量插入新建表LNTE中
INSERT
INTO LNTE
SELECT LNO,TEL
FROM 圖書館
修改數據
UPDATE 圖書
SET BNAME=大學英語
WHERE BNO='B5'; --將圖書表中的操作系統改為大學英語
--帶子查詢的修改語句可以實現批量修改數據
UPDATE SC
SET GRADE=0
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept='CS');
刪除數據
--刪除一個元組的值
DELETE
FROM 圖書
WHERE BNAME='系統分析與設計';
--刪除多個元組
DELET
FROM 圖書 --這條語句將刪除整個圖書表
--帶子查詢的刪除語句
DELET
FROM 圖書
WHERE BNO IN
(SELECT BNO
FROM 圖書發行
WHERE QTY=10);
視圖
創建視圖
CREAT VIEW IS_BK
AS
SELECT BNO,BNAME,PRICE
FROM 圖書
WHERE PRICE>10;
帶WITH CHECK OPTION的視圖
CREAT VIEW IS_BK
AS
SELECT BNO,BNAME,PRICE
FROM 圖書
WHERE PRICE>10;
WITH CHECK OPTION;
視圖消解執行原理
把對視圖的查詢轉化為對基本表的查詢稱為視圖的消解(View Resolution).
SELECT S#,SA FROM IS_S WHERE SA <20
消解為:
SELECT S# ,SA FROM S WHERE SD='IS' AND SA 90
消解為:
對:SELECT S#, AVG(GR) FROM SC GROUP BY S# HAVING AVG(GR)>90
可更新視圖和不可更新視圖的區別
一般地行列子視圖是可更新的。除行列子視圖外,有些試圖理論上是可更新的。
目前,各個關系數據庫管理系統一般都只允許對行列子集視圖進行更新,而且各個系統對視圖的更新還有更進一步的規定。
索引
創建唯一索引
CREATE UNIQUE INDEX BKNO ON 圖書(BNO);
創建復合索引
create nonclustered index Index_StuNo_SName
on Student(S_StuNo,S_Name)
with(drop_existing=on)
修改索引
ALTER INDEX BKNO RENAME TO BOOKNO;
刪除索引
DROP INDEX BOOKNO;
驗證索引有效性
SELECT DISTINCT name
FROM part;
CREATE INDEX part_name ON part(name);
--DROP INDEX part_name ON part;
思考題
-
為什么不能隨意刪除被參考表中的主碼。
刪除主碼會破壞數據的完整性,所以不能刪除主碼。
-
數據庫中一般不允許更改主碼數據。如果需要更改主碼數據時,怎樣處理?
每次修改的時候檢查一下改過之后的數據在數據庫存中是否存在。SQL: SELECT * FROM 表名 WHERE 主鍵 = 更改過后的值。
-
兩種SQL Server的安全認證模式及特點。
-
什么是觸發器?主要功能時什么?
觸發器可以查詢其他表,而且可以包含復雜的 SQL語句。它們主要用於強制服從復雜的業務規則或要求。例如:您可以根據客戶當前的帳戶狀態,控制是否允許插入新訂單。
觸發器也可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。如果使用數據庫關系圖,則可以在表之間創建關系以自動創建外鍵約束。觸發器的主要作用是:
①完成比CHECK約束更復雜的數據約束。觸發器可以引用其他表中的列。
②為保證數據庫性能而維護的非規范化數據。比如,為了提高數據的統計效率,在銷售情況表中增加了統計銷售總量的列,以后,每當在此表中插入數據時,都是用觸發器統計銷售總值列的新數值,並將統計后的新值保存在此表中。以后當查詢銷售總值時,直接從表中提取數據即可,而無須再使用查詢語句進行統計,從而提高數據的統計效率。
③實現復雜的業務規則,觸發器可以使業務的處理任務自動進行。