数据库基础知识点(系列七)
视图和索引相关的语句
1.引入视图的主要目的是什么?
答:数据库的基本表是按照数据库设计人员的观点设计的,并不一定符合用户的需求。SQL Server 2008可以根据用户需求重新定义表的数据结构,这种数据结构就是视图。视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制,其结构和数据是建立在对表的查询基础上的。
2.当删除视图时所对应的数据表会删除吗?
答:不会。
3.简述视图的优点。
答:使用视图有很多优点,主要表现在:
(1) 为用户集中数据,简化用户的数据查询和处理。
(2)保证数据的逻辑独立性。
(3) 重新定制数据,使得数据便于共享;合并分割数据,有利于数据输出到应用程序中。
(4) 数据保密。
4.可更新视图必须满足哪些条件?
答:(1)任何修改(包括UPDATE、INSERT和DELETE语句)都只能引用一个基本表的列。
①如果视图数据为一个表的行、列子集,则可更新(包括UPDATE、INSERT和DELETE语句);但如果视图中包含的列为表定义时不允许取空值又没有给默认值的列,则此视图不可以插入数据。
②如果视图所依赖的基本表有多个时,不能向该视图添加(INSERT)数据。
③若视图依赖于多个基本表,那么一次修改只能修改(UPDATE)一个基本表中的数据。
④若视图依赖于多个基本表,那么不能通过视图删除(DELETE)数据。
(2)如果视图中没有包含表中某个不允许取空值又没有默认值约束的列,则不能利用视图插入数据。
(3)视图中被修改的列必须直接引用表列中的基础数据。
不能是通过任何其他方式对这些列进行派生而来的数据,比如通过聚合函数、计算(如表达式计算)、集合运算等。
(4)被修改的列不应是在创建视图时受GROUP BY、HAVING、DISTINCT或TOP子句影响的。
5.创建索引的必要性和作用是什么?
答:数据库的索引就类似于书籍的目录,如果想快速查找而不是逐页查找指定的内容,可以通过目录中章节的页号找到其对应的内容。类似地,索引通过记录表中的关键值指向表中的记录,这样数据库引擎就不用扫描整个表而定位到相关的记录。相反,如果没有索引,则会导致SQL Server搜索表中的所有记录,以获取匹配结果。
6.索引的优点包括:
(1)大大加快数据的检索速度,这是创建索引的最主要的原因。
(2)创建唯一性索引,保证表中每一行数据的唯一性。
(3)加速表和表之间的连接。
(4)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
(5)查询优化器可以提高系统的性能,但它是依靠索引起作用的。
7.聚集索引和非聚集索引有何异同?
答:聚集索引会对表和视图进行物理排序,所以这种索引对查询非常有效,在表和视图中只能有一个聚集索引。非聚集索引不会对表和视图进行物理排序。如果表中不存在聚集索引,则表是未排序的。
8.在SQL Server Management Studio中创建一个名为“invent_info”的库存信息视图,要求包含“inventory”数据库中四个表的所有列。然后,分析此视图是否为可更新视图,说明理由。
答:略。
9.在SQL Server Management Studio中创建一个包含计算机专业学生基本信息的视图“computer_stu”。 然后,分析此视图是否为可更新视图,说明理由。
答:CREATE VIEW computer_stu
AS
SELECT sno,sname,ssex,sage,en_time,specialty,grade FROM student
WHERE specialty=’计算机’
分析:此视图为可更新视图,通过此视图可以查询、插入、修改和删除计算机专业学生的信息。因为此视图为student表的行子集。
10.利用T-SQL语句创建一个每个学生的平均成绩的视图“avgscore”,要求包含学生的学号和姓名。然后,分析此视图是否为可更新视图,说明理由。
答:CREATE VIEW avgscore
AS
SELECT student.sno,sname,avg(score) AS avg_score
FROM student,sc
WHERE student.sno=sc.sno
GROUP BY student.sno,sname
分析:此视图为不可更新视图。因为此视图中student.sno,sname受GROUP BY影响,为分组列;而avg_score受聚合函数影响,为计算列。
11. 利用T-SQL语句创建一个每个年级、每个专业各科平均成绩的视图。
答:CREATE VIEW grade_s_avg
AS
SELECT grade,specialty,cno,avg(score) AS 平均成绩
FROM student,sc
WHERE student.sno=sc.sno
GROUP BY grade,specialty,cno
分析:此视图为不可更新视图。因为此视图中grade,specialty,cno 受GROUP BY影响,为分组列;而”平均成绩”受聚合函数影响,为计算列。
12.在SQL Server Management Studio中按照“sc”表的成绩列升序创建一个普通索引(非唯一、非聚集)。并举例说明什么查询语句会利用此索引加快查询速度。
答:创建索引(略)。
举例:SELECT * FROM sc WHERE score>=80
又例:SELECT * FROM sc WHERE cno=’C001’
ORDER BY score
13.利用T-SQL语句按照“goods”表的单价列降序创建一个普通索引。并举例说明什么查询语句会利用此索引加快查询速度。
答:CREATE INDEX index_price ON goods(price DESC)
举例:SELECT * FROM goods WHERE price<=1000
又例:SELECT * FROM goods
ORDER BY price
14.利用T-SQL语句按照“manager”表的出生年月列升序创建一个普通索引。并举例说明什么查询语句会利用此索引加快查询速度。
答:CREATE INDEX index_birthday ON manager (birthday)
举例:SELECT * FROM manager
ORDER BY birthday