家庭住址 varchar 50 图 1-12 要创建的表的结构 约束要求如下:
① 将学号设置为主键(PRIMARY KEY),主键名为pk_sid。 ② 为姓名添加唯一约束(UNIQUE),约束名为uk_name。
③ 为性别添加默认约束(DEFAULT),默认名称为df_sex,其值为“男”。 ④ 为出生日期添加属性值约束(CHECK),约束名为ck_beday,其检查条件为:出生日期>?1988-1-1?。
(2)在stu_con表中插入如表1-1所示的数据记录。 表 1-1 在stu-con 表中插入的数据 学号 0009 0010 0011 0012
姓名 张小东 李梅 王强 王强
性别 女
出生日期 1989-4-6 1983-8-5 1988-9-10 1989-6-3
家庭住址
分析各约束在插入记录时所起的作用,查看插入记录后表中数据与所插入的数据是否一致?
(3)使用ALTER TABLE语句的DROP CONSTRAINT参数项在查询分析器中删除为stu_con表所建的约束。
10. 用企业管理器完成实验内容9的所有设置。
11. 在查询分析器中,为studentsdb数据库的grade表添加外键约束(FOREIGN KEY),要求将“学号”设置为外键,参照表为student_info,外键名为ufk_sid。
使用系统存储过程sp_help查看grade表的外键信息。
在grade表中插入表1-2所示记录,观察SQL Server会做何处理,为什么?如何解决所产生的问题?
表1-2
学号 0100
课程编号 0001
分数 78
使用查询分析器删除grade表的外键fk_sid。
四、实验思考
1. 在SQL Server 2000中,可采用哪些方法实现数据完整性? 2. 比较默认对象和默认约束的异同。
实验7 Transact-SQL程序设计
一、实验目的
1. 掌握Transact-SQL的数据类型、常量变量、表达式等概念。 2. 掌握程序中注释的基本概念和使用方法。 3. 掌握程序中的流程控制语句。
4. 掌握SQL Server 2000中常用函数的用法。
5. 掌握游标的概念和声明方法,以及使用游标进行数据的查询、修改、删除操作等。
二、实验准备
1. 了解程序中注释的语法格式。
2. 了解程序中的流程控制语句:IF-ELSE、CASE、WHILE等控制流语句。
3. 了解系统提供的常用数学函数、日期和时间函数、字符串函数和数据类型转换函数的用法。
4. 了解函数的使用方法。 5. 了解游标的使用方法。
三、实验内容和步骤
0. 创建studentsdb数据库及其相应表,并录入数据。 启动查询分析器,运行下面链接的代码即可。 创建数据库代码
1. 在查询分析器中,选择studentsdb数据库,输入以下代码。 DECLARE@stu name varchar(10) SELECT@stu name=姓名 FORM student info
WHERE 姓名 LIKE ?张%? SELECT@stu name
观察显示的结果,与student info表中数据进行比较,@stu name赋值的是SELECT结果集中的哪个数据
2. 定义int型局部变量@grademax、@grademin、@gradesum,在grade表中查找最高分、最低分和总分,分别赋给@grademax、@grademin和@gradesum,并显示。
DECLARE@grademax int,@gradesum,int
SELECT@grademax = max(分数),@grademin = min(分数),@gradesum = sum(分数) FROM grade
SELECT @ grademax ,@grademin,@gradesum
3. 使用SET命令将查询的结果数目赋值给int型局部变量@row。给下面代码中的划线处填上适当的内容,以完成上述操作。
DECLARE@row
SET =(SELECT COUNT(*)FROM grade) @rows —显示@rows的值
4. 以下代码在curriculum 表中插入新纪录: DECLARE @intCId int,@intErrorCode int
INSERT INTO curriculum(课程编号,课程名称,学分) VALUES(?0006?,?VB程序设计?,2)
SELECT@intCId = @ @identity,@intErrorCode = @@error SELECT@intCId, @intErrorCode
将该代码段连续执行两次,观察两次显示的信息及curriculum表中数据的变化,为什么 前后两次执行时显示的信息会不同?
5. 在studentsdb数据库的student info表中,以“性别”为分组条件,分别统计男生和女生人数。
6. 在grade表中,使用适当函数找出“高等数学”课程的最高分、最低分和平均分。 7. 定义一个datetime型局部变量@student,以存储当前日期。计算student info表 中的学生的年龄,并显示学生的姓名、年龄。在以下代码的划线部分填入适当内容,以实现上述功能。
DECLARE datetime
SET@student = —给@student赋值为当前日期 SELECT 姓名, (@student)-year(出生日期)AS年龄 FROM student info
8. 运行以下代码,写出运行结果。 DECLARE@ a int ,@ b int SET @a =168 SET @b = 73
SELECT @a & @b,@a| @b ,@a^@b
9. 在局部变量@stu id中存储了学号值。编写代码查询学号为0001的学生的各科平 均成绩,如果平均分>=60则显示“你的成绩及格了,恭喜你!!”,否则显示“你的成绩不及格”。
IF ((SELECT AVG(分数) FROM grade where 学号 = ?0001?)<60) PRINT ?你的成绩不及格? ELSE
PRINT ?你的成绩及格了,恭喜你!!? 10. 运行以下代码段,写出运行的结果。 DECLARE @counter int SET @ counter = 1 WHILE @ counter <10 BEGIN
SELECT ?@counter的值现在为:?+CONVERT(CHAR(2),@counter) SET @ counter = @ counter +1 END
11. 查询grade表。如果分数大于等于90,显示A;如果分数大于等于80小于90,显 示B;如果分数大于等于70小于80,显示C;如果分数大于等于60小于70,显示D;其他显示E。在以下代码的划线部分填入适当内容完成上述功能。 SELECT学号,分数,等级 = CASE
分数>=90 THEN ?A?
WHEN 分数>=80 AND 分数<90 ?B? WHEN 分数>=70 AND 分数<80 THEN ?C? WHEN 分数>=60 AND 分数<70 THEN ELSE ?E? END
FROM grade
12. 计算grade表的分数列的平均值。如果小于80,则分数增加其值的5%;如果分数 的最高值超过95,则终止该操作。在以下代码划线处填入适当的内容以完成上述功能。 WHILE (SELECT (分数)FROM grade)<80 BEGIN
UPDATE grade
SET 分数 = 分数*1.05
If (SELECT MAX(分数)FROM grade)> BREAK ELSE END
13. 编写代码计算并显示@ n = 1+2+3+...+20。
14. 编写代码计算并显示1~100之间的所有完全平方数。例如,81 = 92,则称81为完 全平方数。
15. 计算1~100以内的所有的素数。
16. 在studentsdb数据库中,使用游标查询数据。
(1) 打开查询分析器,声明一个stu cursor游标,要求返回student info表中性别 为“男”的学生记录,且该游标允许前后滚动和修改。
(2) 打开stu cursor游标。 (3) 获取并显示所有数据。 (4) 关闭该游标。 17. 使用游标修改数据。 (1) 打开stu cursor游标。
(2) 将姓马的男同学的出生日期的年份加1。 (3) 关闭stu cursor。
18. 声明游标变量@stu c,使之关联stu cursor游标,利用stu c查询年龄在6~9 月份出生的学生信息。
19. 使用系统存储过程sp cursor list显示在当前作用域内的游标及其属性。
四、实验思考
1. 使用游标对数据库的表进行删除和修改等操作。 2. 流程控制语句与其他编程语言提供的语句有何差别? 3. 区分局部变量与全局变量的不同,思考全局变量的用处。