SQL Server 2008数据库应用与开发教程(第二版)
部门经理 nchar(8)
电话 char(12))
创建销售表:
USE 销售
CREATE TABLE 销售( 部门号 char(6) not null, 商品号 char(6) not null, 数量 int,
金额 money)
7. 用T-SQL语句为上一题中创建的每张表至少添加10条记录。 使用INSERT语句插入记录(略) 8. 使用数据库stuinfo,进行如下操作:
1) 将任课教师Daad改为Forster 语句为:
UPDATE course SET cteacher=N'Forster' WHERE cteacher=N'Daad'
2) 增加课程vc++,课程号为07,学分为6,任课教师为Emily 语句为:
INSERT INTO course VALUES ('07','vc++','6','Emily')
3) 删除学生贾新民的相关记录
DELETE FROM student WHERE sname=N'贾新民'
4) 查询所有学生的姓名及年龄
SELECT sname,sage FROM student
5) 查询所有考试不及格的学生的学号、姓名和成绩
SELECT sno,sname,grade
FROM student,sc
Where student.sno=sc.sno and grade<60
6) 查询年龄在20-22岁之间的学生姓名、年龄、所属院系和政治面貌
SELECT sname,age,sdept,spolicitalstatus FROM student
WHERE sage between 20 and 22
7) 查询所有姓李的学生的学号、姓名和性别
SELECT sno,sname,ssex FROM student WHERE sname like N'李%'
8) 查询名字中第2个字为“华”字的女学生的姓名、年龄和所属院系
SELECT sname,sage,sdept FROM student WHERE sname like N'_华'
9) 查询所有选了3门课以上的学生的学号、姓名、所选课程名称及成绩
SELECT student.sno,sname,cname,grade FROM student,course,sc WHERE student.sno=sc.sno and course.cno=sc.cno
GROUP BY sc.sno HAVING COUNT(*)>3
SQL Server 2008数据库应用与开发教程(第二版)
10) 查询每个同学各门课程的平均成绩和最高成绩,按照降序排列输出学生姓名、
平均成绩和最高成绩
SELECT sname,AVG(grade) as '课程平均分', MAX(grade) as '课程最高分'
FROM student,sc
WHERE student.sno=sc.sno ORDER BY AVG(grade) DESC GROUP BY student.sno
11) 查询所有学生都选修了的课程号和课程名
SELECT cno,cname FROM course WHERE NOT EXISTS( SELECT * FROM student WHERE NOT EXISTS(
SELECT * FROM SC WHERE sc.cno=course.cno and sc.sno=student.sno))
第八章习题参考答案
1.在索引命令中使用关键字CLUSTERED和NONCLUSTERED分别表示将建立的是_聚集索引和非聚集_索引。
2.访问数据库中的数据有两种方法,分别是:表扫描________和__索引查找_______。 3.索引一旦创建,将由_数据库管理系统自动管理和维护。
4.在一个表上,最多可以定义_1___个聚集索引,最多可以有_多个非聚集索引。 5.设有一个职员表为Customers,其上有客户姓名(Name),客户ID(ID)等列,表执行如 下语句:
CREATE CLUSTERED INDEX idx ON Customers(Name) 得到以下错误:
Cannot create more than one clustered index 原因是什么,为什么会出错?
答:因为在一个表中只能创建一个聚集索引。
第九章习题参考答案
1. 什么是数据的完整性?数据完整性的主要问题是什么? 答:
数据完整性(Data Integrity)是??指数据的精确性(Accuracy) 和可靠性(Reliability)。它是应防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。数据完整性分为四类:实体完整性(Entity Integrity)、域完整??性(Domain Integrity)、参照完整性(Referential Integrity)、用户定义的完整性(User-definedIntegrity)。??????保证数据的完整性:??1. 用约束而非商务规则强制数据完整性????如果你按照商务规则来处理需求,那么你应当检查商务层次/用户界面:如果商务规则以后发生变化,那么只需要进行更新即可。????假如需求源于维护数据完整性的需要,那么在数据库层面上需要施加限制条件。
SQL Server 2008数据库应用与开发教程(第二版)
????如果你在数据层确实采用了约束,你要保证有办法把更新不能通过约束检查的原因采用用户理解的语言通知用户界面。除非你的字段命名很冗长,否则字段名本身还不够。 — Lamont Adams????只要有可能,请采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规则之上。????
2. 什么是域完整性、实体完整性和引用完整性?
答:实体完整性,要求表中每一条记录(每一行数据)是惟一的,即它必须至少拥有一个惟一标识以区分不同的数据行。实现方法有:主键约束PRIMARY KEY、惟一性约束UNIQUE、惟一索引UNIQUE INDEX、标识IDENTITY等 。
? 值域完整性,限定表中输入数据的数据类型与取值范围。实现方法:默认值约束DEFAULT或默认对象、核查约束CHECK、外键约束FOREIGN KEY、规则RULE 、数据类型、非空性约束NOT NULL等。
? 引用完整性,指对数据库进行添加、删除、修改数据时,要维护表间数据的一致性。实现方法:外键约束FOREIGN KEY、核查约束CHECK、触发器TRIGGER、存储过程PROCEDURE。
用户定义的完整性,用于实现用户特殊要求的数据规则或格式。实现方法:默认值DEFAULT、核查约束CHECK、规则RULE 等。 3. 约束的作用和类型是什么?
答: 答:在SQL Server 2008中,共有6种约束:主键约束(primary key constraint)、唯一性约束(unique constraint)、检查约束(check constraint)、默认约束(default constraint)、外部键约束(foreign key constraint)和空值(NULL)约束。 4. DEFAULE约束的特点是什么?
答:默认约束指定在插入操作中如果没有提供输入值时,则SQL Server系统会自动为该列指定一个值。默认约束可以包括常量、函数、不带变元的内建函数或者空值。
使用默认约束时,应该注意以下几点:每个字段只能定义一个默认约束;如果定义的默认值长于其对应字段的允许长度,那么输入到表中的默认值将被截断;不能为带有IDENTITY属性或者数据类型为timestamp的字段添加默认约束;如果字段定义为用户定义的数据类型,而且有一个默认绑定到这个数据类型上,则不允许该字段有默认约束。
5. 为社么要引入CHECK约束?
答:对表中的某些列创建CHECK(检查)约束是为了实施数据的域完整性约束。检查约束对输入列或者整个表中的值设置检查条件,以限制输入值,保证数据库数据的完整性和有效性。 使用检查约束时,应该考虑和注意以下几点:一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中字段有关;一个表中可以定义多个检查约束;每个 CREATE TABLE 语句中的每个字段只能定义一个检查约束;在多个字段上定义检查约束,则必须将检查约束定义为表级约束;当执行 INSERT 语句或者 UPDATE 语句时,检查约束将验证数据。
SQL Server 2008数据库应用与开发教程(第二版)
6. 主键约束的作用和创建方式是什么?
答:一个表通常可以通过一个列或多个列组合的数据来唯一标识表中的每一行,这个列或列的组合就称为表上的主键。创建表中的主键是为了保证数据的实体完整性。PRIMARY KEY (主键)约束用于定义基本表的主键,它是唯一确定表中每一条记录的标识符,其值不能为NULL,也不能重复,以此来保证实体的完整性。
创建主键的方法有两种:使用SSMS操作法和Transact-SQL 语句操作法。
使用SSMS图形化界面创建主键约束
在“对象资源管理器”窗口中,展开“数据库”节点下某一具体数据库,展开“表”节点,右键单击要创建主键的表,从弹出的快捷菜单中选择“设计”命令,这时“文档”窗口中打开“表设计器”页,可对表进行进一步定义;选中表中的某列,单击鼠标右键,从弹出的快捷菜单中选择“设置主键”命令即可为表设置主键,
创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。
命令格式:
CREATE TABLE table_name ( column_name data_type
[ DEFAULT default_expression ] | [ IDENTITY [ ( seed ,increment ) ] ] [ [ CONSTRAINT constraint_name ]
PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] ] [,... n] )
7. UNIQUE约束的使用场景是什么?
答:一个表只能有一个主键,若有多列或多个列组合需要实施数据惟一性,则可采用惟一约束。惟一约束与主键约束的主要区别在于:惟一约束用于非主键列,使之满足数据惟一性要求;惟一约束允许NULL值,而主键不允许;惟一约束可以在多列或多个列组合上分别设置,而主键只能在一列或一个列组合上设置。 8. 外键约束的特点是什么?
答:FOREIGN KEY约束是用于建立和加强两个表数据之间的链接的一列或多列。设置表中的外键约束是为了保证数据的参照完整性。SQL Server 2008中的关系保证了表之间的连接,用外键表(参照关系)中的外键引用主键表(被参照关系)中的主键。一旦创建了关系并将关系成功地加入到数据库中,就能够保证数据的参照完整性。FOREIGN KEY约束确保了同一个表或者不同表之间的引用完整性。
第十章习题参考答案
1. 试说明存储过程的特点及分类
存储过程是事先编好的、存储在数据库中一组被编译了的T-SQL命令集合,这些命令用来完成对数据库的指定操作。
SQL Server 2008数据库应用与开发教程(第二版)
SQL Server 2008支持不同类型的存储过程:系统存储过程、扩展存储过程、用户存储过程,以满足不同的需要。
2. 举例说明存储过程的定义与调用
创建名为snoquery的存储过程:通过用户输入学生学号来查询学生的姓名、年龄、性别和所属院系。 定义存储过程:
(1)启动SSMS,展开服务器。
(2)展开所需的“数据库”文件夹,展开要在其中创建存储过程的数据库。本例中,我们展开stuinfo数据库。
(3)展开“可编程性”文件夹,在“存储过程”文件夹上右击鼠标,在弹出的快捷菜单中选择“新建存储过程”项。
(4)系统弹出T-SQL语句编写窗口,其中的代码是创建存储过程的格式说明。我们输入以下T-SQL代码:
CREATE PROCEDURE snoquery @xuehao char(10) AS
SELECT sno 学号,sname 学生姓名,sage 年龄,ssex 性别,sdept 所属院系 FROM student WHERE sno=@xuehao
调用存储过程:
代码输入结束后,只要将以上代码在“查询分析器”里执行一次,系统就会在当前数据库中创建一个名为snoquery的存储过程。点击刷新按钮,选择stuinfo数据库,在左边的树型列表中选择“存储过程”,就可以看到属于dbo(database owner)的存储过程dbo.snoquery。
3. 举例说明触发器的使用
创建触发器stu_delete,实现如下功能:当按照学号删除student表中的某学生记录后,对应的该学生在sc表中的记录也被自动删除。 T-SQL语句为:
USE stuinfo GO
CREATE TRIGGER stu_Delete ON student FOR DELETE AS
DELETE FROM sc WHERE sno=(SELECT sno FROM deleted)
执行后,我们查询student表和sc表,如图7-6所示,可以看到两个表中均存在学号为20070102的学生记录。
在student表中执行数据删除语句: