实验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约束更复杂的数据约束。触发器可以引用其他表中的列。
②为保证数据库性能而维护的非规范化数据。比如,为了提高数据的统计效率,在销售情况表中增加了统计销售总量的列,以后,每当在此表中插入数据时,都是用触发器统计销售总值列的新数值,并将统计后的新值保存在此表中。以后当查询销售总值时,直接从表中提取数据即可,而无须再使用查询语句进行统计,从而提高数据的统计效率。
③实现复杂的业务规则,触发器可以使业务的处理任务自动进行。