WHERE NAME=? Abernathy Construction?
(23) 写出删除客户ABERNATHY CONSTRUCTION的所有订单SQL语句。
DELETE FROM ORDER
WHERE CustName=? Abernathy Construction?
(24) 写出将销售员JONES的工资改成45000的SQL语句。
UPDATE SALESPERSON SET Salary=45000
WHERE Name=? JONES?
(25) 写出将所有的销售员的工资加10%的SQL语句。
UPDATE SALESPERSON SET Salary= Salary*1.10
(26) 假设销售员JONES的名字改成PARKS,写出对应的SQL语句。
UPDATE SALESPERSON SET Name =?PARKS? WHERE Name=? JONES?
第六章
1. 简述聚集索引和非聚集索引的特点
2. 简述建立索引的好处以及索引对数据更新操作的影响?
3. 既然索引能够提高查找速度,那么表中的索引是否是越多越好?简述在何种情况下应该设置索引?在何种情况下
设置聚集索引,何种情况下设置非聚集索引。 4. 在SQL SERVER中,哪些字段不允许设置索引? 5. 简述在创建聚集索引时应该考虑的要点有哪些? 6. 在Student数据的以下表中
字段名 StudentID StudentCode StudentName Sex Phone Address Parent Birthdate Remark Photo RegisterDate 学生表(Student)基本数据表的字段 类型 长度 Int (Identity) Char 8 Varchar 20 Bit Varchar 20 Varchar 100 Varchar 20 Smalldatetime Varchar 500 Image Datetime 成绩表(Score)基本数据的字段 长度 小数位 8 1 5 1 5 1 5 1 5 1 5 1
字段名 ScoreID StudentCode ExamType Chinese Math English Physics Chemist 类型 Int(Identity) Char Char Decimal Decimal Decimal Decimal Decimal
(1) 在Student 表的StudentCode字段创建聚集索引Index_StudentCode,并且该索引为唯一索引,然后向Student
表中插入一条与表中记录的StudentCode字段相同的记录,检查能否插入成功。
(2) 在Student 表的StudentName字段创建非聚集索引 (3) 在Score 的StudentCode字段创建聚集索引 (4) 在Score 的ScoreID列创建唯一索引。
36
7. 在Product数据库中,PART(零件表)的结构如下所示:
PART(零件表) PNO(零件号) PNAME(零件名称) QUTY(库存量) 101 CAM 150 102 BOLT 300 105 GEAR 50 203 BELT 30 207 WHEEL 120 215 WASHER 1300 QUATATIONS(报价表) SNO PNO PRICE(报价) D_TIME(供货时间) DELIQUTY(供货量) 51 101 25 10 50 51 105 42 15 100 52 101 20 15 75 52 203 13 7 50 58 102 9 5 200 67 207 34 12 0 67 215 4 3 500 69 105 36 20 40 69 203 15 10 30 (1) 在PART表的PNO字段创建聚集索引Index_Pno,检查数据的排序顺序。删除Index_Pno索引,然后在PART表的PNAME列上创建Index_Pname聚集索引,再次检查数据的排序顺序。
(2) 在QUATATIONS表的SNO和PNO字段上创建一个复合索引,Index_SnoPno。 8. 使用哪些命令进行维护索引?哪些指标能够显示索引的碎片情况? 9. 简述使用哪些方法可以清除索引碎片?这些方法有何区别? 10. 简述为什么要使用视图查看数据?视图的优点有哪些? 11. 视图是一张“虚表”,请简述视图和表的相同点和区别 12. 创建一张用于查看男同学信息的视图。
13. 创建视图view_Score(StudentCode,StudentName,Chinese, Math, English, Physics, Chemist,TotalScore),查询每个学生
每门课程的期末考试成绩以及总成绩(TotalScore)。
14. 创建视图view_Student(StudentCode, StudentName, Sex, Phone, Address, Parent, Birthdate),查询学生的信息
15. 使用INSERT INTO(?20060304?,?ChengMing?,1,?010-80603310?,?Beijing?,?ChenHong?,?1986-01-08?)语句更新
view_Student视图,然后再次查询该视图以及查询Student表检查执行结果。 16. 使用UPDATE view_Student SET Phone=?010-82375177? WHERE StudentCode=? 20060304??,更新视图,然后再次查
询该视图以及查询Student表检查更新结果。
参考答案
1. 简述聚集索引和非聚集索引的特点
聚集索引确定表中数据的物理顺序,索引顺序就是数据的物理顺序。
由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。
非聚集索引的特点是索引与数据分别存储在数据页上,索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储,索引带有指针指向数据的存储位置。 2. 简述建立索引的好处以及索引对数据更新操作的影响?
优点:加速检索、排序、成组、连接的顺序 缺点:影响更新性能
3. 既然索引能够提高查找速度,那么表中的索引是否是越多越好?简述在何种情况下应该设置索引?在何种情况下
设置聚集索引,何种情况下设置非聚集索引。
并非索引越多越好,索引过多,SQL SERVER 维护索引的开销越大 在查询中经常引用的表、字段、唯一值列中创建索引 将非聚集索引用于:
? 包含大量非重复值的列,如姓氏和名字的组合(如果聚集索引用于其它列)。如果只有很少的非重复值,
如只有 1 和 0,则大多数查询将不使用索引,因为此时表扫描通常更有效。 ? 不返回大型结果集的查询。
? 返回精确匹配的查询的搜索条件(WHERE 子句)中经常使用的列。 ? 经常需要联接和分组的决策支持系统应用程序。应在联接和分组操作中使用的列上创建多个非聚集索引,
37
在任何外键列上创建一个聚集索引。
? 在特定的查询中覆盖一个表中的所有列。这将完全消除对表或聚集索引的访问。 将聚集索引用于:
? 包含大量非重复值的列。
? 使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。 ? 被连续访问的列。
? 返回大型结果集的查询。
? 经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对 ORDER BY 或
GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。
? OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)
4. 在SQL SERVER中,哪些字段不允许设置索引?
Image、Text 字段
5. 简述在创建聚集索引时应该考虑的要点有哪些?
? 包含大量非重复值的列。
? 使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。 ? 被连续访问的列。
? 返回大型结果集的查询。
? 经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对 ORDER BY 或
GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。
? OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键) ? 定义聚集索引键时使用的列越少越好
6. 在Student数据的以下表中
字段名 StudentID StudentCode StudentName Sex Phone Address Parent Birthdate Remark Photo RegisterDate 学生表(Student)基本数据表的字段 类型 长度 Int (Identity) Char 8 Varchar 20 Bit Varchar 20 Varchar 100 Varchar 20 Smalldatetime Varchar 500 Image Datetime 成绩表(Score)基本数据的字段 长度 小数位 8 1 5 1 5 1 5 1 5 1 5 1
字段名 ScoreID StudentCode ExamType Chinese Math English Physics Chemist 类型 Int(Identity) Char Char Decimal Decimal Decimal Decimal Decimal
(1)
在Student 表的StudentCode字段创建聚集索引Index_StudentCode,并且该索引为唯一索引,然后向Student表中插入一条与表中记录的StudentCode字段相同的记录,检查能否插入成功。 CREATE UNIQUE CLUSTERED INDEX Index_StudentCode ON Student(StudentCode) GO
INSERT INTO Student (StudentCode) VALUES(?20050528?)
38
GO
INSERT INTO Student (StudentCode) VALUES(?20050528?) (2)
在Student 表的StudentName字段创建非聚集索引 CREATE INDEX Index_StudentName ON Student(StudentName) (3)
在Score 的StudentCode字段创建聚集索引 CREATE INDEX Index_StudentCode ON Score (StudentCode) (4)
在Score 的ScoreID列创建唯一索引。 CREATE INDEX Index_ScoreID ON Score (ScoreID)
7. 在Product数据库中,PART(零件表)的结构如下所示:
PART(零件表) PNO(零件号) PNAME(零件名称) QUTY(库存量) 101 CAM 150 102 BOLT 300 105 GEAR 50 203 BELT 30 207 WHEEL 120 215 WASHER 1300 QUATATIONS(报价表) SNO PNO PRICE(报价) D_TIME(供货时间) DELIQUTY(供货量) 51 101 25 10 50 51 105 42 15 100 52 101 20 15 75 52 203 13 7 50 58 102 9 5 200 67 207 34 12 0 67 215 4 3 500 69 105 36 20 40 69 203 15 10 30
(1)在PART表的PNO字段创建聚集索引Index_Pno,检查数据的排序顺序。删除Index_Pno索引,然后在PART表的PNAME列上创建Index_Pname聚集索引,再次检查数据的排序顺序。 CREATE CLUSTERED INDEX Index_ Pno ON PART (PNO) GO
DROP INDEX Index_PNO GO CREATE CLUSTERED INDEX Index_Pname ON PART (PNAME) GO
(2)在QUATATIONS表的SNO和PNO字段上创建一个复合索引,Index_SnoPno。 CREATE CLUSTERED INDEX Index_ SnoPno ON QUATATIONS (SNO, PNO) GO
8. 使用哪些命令进行维护索引?哪些指标能够显示索引的碎片情况?
DBCC INDEXDEFRAG CREATE INDEX ….WITH DROP_EXISTING DBCC REINDEX
DBCC SHOWCONTIG 显示索引碎片
9. 简述使用哪些方法可以清除索引碎片?这些方法有何区别?
? DBCC INDEXDEFRAG
DBCC INDEXDEFRAG 可以对表或视图上的索引和非聚集索引进行碎片整理。DBCC INDEXDEFRAG 对索引的叶级进行碎片整理,以便页的物理顺序与叶节点从左到右的逻辑顺序相匹配,从而提高索引扫描性能。
39
?
10.
11.
12.
13.
14.
15.
16.
CREATE INDEX ….WITH DROP_EXISTING
指定应除去并重建已命名的先前存在的聚集索引或非聚集索引。为已经具有非聚集索引的表重建聚集索引时(使用相同或不同的键集),DROP_EXISTING 子句可以提高性能。如果键没有改变(提供的索引名和列与原索引相同),则 DROP_EXISTING 子句不会重新对数据进行排序。在必须压缩索引时,这样做会很有用。 简述为什么要使用视图查看数据?视图的优点有哪些? ? 视图存储为数据库设计的一部分,而查询则不是。
? 每个视图都存储在数据库内,所以视图建立特定的数据子集可以供任何数据库用户使用。
? 视图可以隐藏基表。可以禁止所有用户访问数据库表,而要求用户只能通过视图操作数据。这种方法可以保
护用户和应用程序不受某些数据库修改的影响。 ? 对视图和查询的结果集更新限制是不同的。 ? 可以加密视图,但不能加密查询。 视图是一张“虚表”,请简述视图和表的相同点和区别 表中存储了数据
视图中不物理存储数据,而是存储了一段查询,当用户查询视图时,SQL SERVER将视图的定义转换为查询,从表中获取数据提供给用户。用户对视图的更新,也将通过视图的定义更新到物理表中。 创建一张用于查看男同学信息的视图。 CREATE VIEW view_male AS
SELECT * FROM Student WHERE SEX=1
创建视图view_Score(StudentCode,StudentName,Chinese, Math, English, Physics, Chemist,TotalScore),查询每个学生每门课程的期末考试成绩以及总成绩(TotalScore)。 CREATE VIEW view_Score AS
SELECT StudentCode,StudentName,Chinese, Math, English, Physics, Chemist, Math+ English+Physics+ Chemist AS TotalScore FROM Score
创建视图view_Student(StudentCode, StudentName, Sex, Phone, Address, Parent, Birthdate),查询学生的信息 CREATE VIEW view_Student AS
SELECT StudentCode, StudentName, Sex, Phone, Address, Parent, Birthdate FROM Student
使用INSERT INTO view_Student VALUES
(?20060304?,?ChengMing?,1,?010-80603310?,?Beijing?,?ChenHong?,?1986-01-08?)语句更新view_Student视图,然后再次查询该视图以及查询Student表检查执行结果。 INSERT INTO view_Student
VALUES(?20060304?,?ChengMing?,1,?010-80603310?,?Beijing?,?ChenHong?,?1986-01-08?) GO
SELECT * FROM Student
WHERE StudentCode=?20060304? 使用UPDATE view_Student SET Phone=?010-82375177? WHERE StudentCode=? 20060304?,更新视图,然后再次查询该视图以及查询Student表检查更新结果。 UPDATE view_Student SET Phone=?010-82375177? WHERE StudentCode=? 20060304? GO
SELECT * FROM Student
WHERE StudentCode=? 20060304?
第七章
1. 2. 3. 4.
简述什么是存储过程?为什么使用存储过程?
调用存储过程与存储在本地的T-SQL语句相比有什么有点?
何时需要重新编译存储过程?有哪些方法可以重新编译存储过程?这些方法有什么区别? 在SQL SERVER中,存储过程有哪些类型?这些存储过程有何区别?
40