我们应该从这四点中学到什么。(个人总结)
关于索引
在数据库里面建立索引是为了加快数据的查询速度,但是索引在数据库中会占用一小部分存储空间来存储索引信息,因此,利用索引提高查询效率是以占用空间和增加数据更改的时间为代价的。
索引分为两大类:聚集索引和非聚集索引。两者的区别:1.数据不按非聚集索引关键字的顺序排序和存储。2.非聚集索引的叶节点不是存放数据的数据页。
对于索引,要知道,创建非聚集索引:
CREATE INDEX Sname_ind ON Student ( Sname )
创建唯一聚集索引:
CREATE UNIQUE CLUSTERED INDEX Sname_ind ON Student ( Sname )
创建聚集索引:
CREATE CLUSTERED INDEX Ename_ind ON Employee( FirstName, LastName )
删除索引:
DROP INDEX <表明>.<索引名>
视图
视图就像一个窗口,透过它就可以看到数据库中用用户自己感兴趣的数据。
视图有两个好处,第一是视图里面的数据始终与基本表里面的数据保持一致,第二是节省了存储空间,当数据量非常大时,重复数据的存储是非常耗费时间的。
我们要学到什么。
学会建立视图。
CREATE VIEW <视图名>
AS
SELECT语句
举例:
建立查询信息管理系学生的学号,姓名,性别和年龄的视图X。
CREATE VIEW IS_Student
AS
SELECT Sno, Sname, Ssex, Sage
FROM Student WHERE Sdept = ‘信息管理系’
在视图下定义视图。
利用上面的视图X,建立查询信息管理系年龄小于20的学生的学号、姓名和年龄的视图。
CREATE VIEW IS_Student_Sage
AS
SELECT Sno, Sname, Sage
FROM IS_Student WHERE Sage < 20
定义一个查询每个学生的学号及平均成绩的视图Y。
CREATE VIEW S_G
AS
SELECT Sno, AVG(Grade) AverageGrade FROM SC
GROUP BY Sno**
通过视图查询数据
上面已经说到,视图像一个窗口,其实那就像是多个表精炼之后的一张表。通过视图查询数据,语法用SELECT 视图 即可。
例子:利用上面的视图X,查询信息管理系男生的信息。
SELECT * FROM 视图X WHERE Ssex = ‘男’
再来一个多表联合查询吧。
查询信息管理系学生的学号、姓名、所选课程的课程名。
思路:视图X里面没有课程信息,因此要和SC表和Course表相联合。
SELECT x.Sno, Sname,Cname
FROM 视图X x JOIN SC ON x.Sno = SC.Sno
JOIN Course c ON c.Cno = SC.Cno
修改和删除视图
- 修改示例:ALTER关键字
修改上面视图Y使其统计每个学生的考试平均成绩和选修课程的总门数。
ALTER VIEW S_G (Sno, AverageGrade, Count_Cno)
AS
SELECT Sno, AVG(Grade), Count(*) FROM SC
GROUP BY Sno
- 删除示例:DROP关键字
删除IS_Student视图。
DROP VIEW IS_Student
视图的作用:
1.简化了数据查询语句。
2.使用户从多角度看待同一数据。
3.提高了数据的安全性。
4.提供了一定程度上程序的逻辑独立性。
触发器
触发器(TRIGGER)
意义:是一段由对数据的更改操作引发的自动执行的代码。这些更改操作包括UPDATE、INSERT、DELETE。
语法:
CREATE TRIGGER 触发器名
ON 表名或视图名
FOR或AFTER或INSTEAD OF
AS
SQL语句
根据上述语法第三行关键字的不同可以将触发器可分为后触发性触发器(FOR或AFTER)和前触发性触发器(INSTEAD OF)。
后触发性触发器示例:限制每个学生总的选课门数不能超过10门。
思路:当条件达到10门以上之后,执行回滚操作。
CREATE Trigger tri_Total_AFT
ON SC AFTER INSERT
AS
IF (SELECT COUNT(*)FROM SC WHERE Sno IN (SELECT Sno FROM INSTERTED))>10
ROLLBACk
前触发性触发器示例:限制每个学生总的选课门数不能超过10门。
思路:当条件达到10门以上之后,执行重做操作(代码最后一句便是重做操作)。
CREATE Trigger tri_Total_INS
ON SC INSTED OF INSERT
AS
IF (SELECT COUNT(*)FROM SC WHERE Sno IN (SELECT Sno FROM INSTERTED))>10
INSERT INTO SC SELECT * FROM INSERTED
删除触发器
不用想肯定用DROP关键字。
DROP TRIGGER 触发器名
存储过程
持续更新。。。