实验3 SQL语言—更新操作、视图、索引等操作

实验3 SQL语言—更新操作、视图、索引等操作

实验目的要求

  1. 熟悉数据库的数据更新操作,能够使用SQL语句对数据库进行数据的插入、修改、删除操作。

  2. 熟悉SQL语言有关视图的操作,能够熟练使用SQL语句来创建需要的视图,定义数据库外模式,并能使用所创建的视图实现数据管理。

  3. 掌握索引设计原则和技巧,能够创建合适的索引以提高数据库查询。

实验主要内容

  1. 针对SQL Server数据库设计单元组插入、批量数据插入、修改数据和删除数据等SQL语句。理解和掌握INSERT、UPDATE和DELETE语法结构的各个组成成分,结合嵌套SQL子查询,分别设计几种不同形式的插入、修改和删除数据的语句,并调试成功。

  2. 针对给定的数据库模式,以及相应的应用需求,创建视图、创建带WITH CHECK OPTION的视图,并验证视图WITH CHECK OPTION选项的有效性。理解和掌握视图消解执行原理,掌握可更新视图和不可更新视图的区别

  3. 针对给定的数据库模式和具体应用需求,创建唯一索引、函数索引、复合索引等;修改索引;删除索引。设计相应的SQL查询验证索引有效性。

实验仪器设备

  1. 学生每个一台PC
  2. 已安装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;

思考题

  1. 为什么不能随意删除被参考表中的主码。

    删除主码会破坏数据的完整性,所以不能删除主码。

  2. 数据库中一般不允许更改主码数据。如果需要更改主码数据时,怎样处理?

    每次修改的时候检查一下改过之后的数据在数据库存中是否存在。SQL: SELECT * FROM 表名 WHERE 主键 = 更改过后的值。

  3. 两种SQL Server的安全认证模式及特点。

    1. 混合模式,百就是使用windos集成的身份验证也可以,使用SQL Server独立认证也可以。这种方式验证方式较宽,安全性跟兼容性是较为平衡的。
    2. Windows集成身份验证,仅度仅支持windos集成的身份,这种方式比较不安全,因为没有SQL Server的独立授权,与Windows自身的权限可能出现专交叉问题,会造成安全问题。
  4. 什么是触发器?主要功能时什么?

    触发器可以查询其他表,而且可以包含复杂的 SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
      触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。

    触发器的主要作用是:

    ①完成比CHECK约束更复杂的数据约束。触发器可以引用其他表中的列。

    ②为保证数据库性能而维护的非规范化数据。比如,为了提高数据的统计效率,在销售情况表中增加了统计销售总量的列,以后,每当在此表中插入数据时,都是用触发器统计销售总值列的新数值,并将统计后的新值保存在此表中。以后当查询销售总值时,直接从表中提取数据即可,而无须再使用查询语句进行统计,从而提高数据的统计效率。

    ③实现复杂的业务规则,触发器可以使业务的处理任务自动进行。

原文地址:https://www.cnblogs.com/Weber-security/p/13167987.html