实验内容与完成情况(记录所有的实验过程): 1、使用局部变量、全局变量 (1)定义一个tinyint的整型变量,为其赋值58,并显示变量的值。 DECLARE @var tinyint SET @var=58 SELECT @var input (2)定义一个长度为20的可变长度型字符变量,为其赋值“Welcome to FJUT”, 并显示变量的值。 DECLARE @var varchar(20) SET @var='Welcome to FJUT' SELECT @var string (3)在批处理中声明两个局部变量@ssex和@sdept并对它们赋值,对Student表进行查询,要求两局部变量在SELECT 语句的 WHERE 子句中被使用,查询的要求是性别为‘男’或所在系为‘CS’系的那些学生。 DECLARE @ssex varchar(2),@sdept varchar(4) SET @ssex='男' SET @sdept='CS' SELECT * FROM Student WHERE Ssex=@ssex OR Sdept=@sdept; (4)查询当前数据库管理系统版本。 SELECT @@VERSION version; (5)在student表中执行所有学生年龄加1岁语句,并用 @@ROWCOUNT 来检测是否有发生更改的行。 UPDATE Student SET Sage+=1 SELECT @@ROWCOUNT lines; 2. 函数的使用 (1) 数学函数的使用: a.分别用函数求出-5的绝对值,25的平方根,3的三次方。 SELECT ABS(-5) 绝对值 SELECT SQRT(25) 平方根 SELECT 3*3*3 三次方 b.写出以下语句的执行结果: Select '自然对数'=LOG(10), '指数' =EXP(2), '符号' =SIGN(2) Select '圆周率' =PI(), '正弦' =SIN(PI()/2.0), '余弦' =COS(PI()) (2) 字符串函数的使用: 去掉字符串' machine '左边的2个空格,右边与'press'连接起来; DECLARE @str1 varchar(10) SET @str1=' machine'; DECLARE @str2 varchar(10) SET @str2='press'; SELECT LTRIM(@str1)+@str2 string; (3) 日期、时间函数的使用: 1)返回系统当前日期并以整数形式返回当前日期的年份、月份、日; SELECT DATENAME(YYYY,GETDATE())+'年'+DATENAME(MM,GETDATE())+'月'+DATENAME(DD,GETDATE())+'日' 日期; 2)返回给定日期“2018-5-21”与当前日期相差的天数。 SELECT DATEDIFF(DAY,'2018-5-21',GETDATE()) 相差的天数; (4) 系统函数与元数据函数的使用:显示当前数据库用户的名称 SELECT USER 当前数据库用户;
(1)在 SELECT 语句中,CASE 搜索函数允许根据比较值在结果集内对值进行替换。要求仿照《数据库系统概论》的sc表,根据学生的成绩范围将成绩(grade 列)显示为文本注释。(要求:<60分,文本注释为“不及格”,60-70,“及格”,70-80,“中”,80-90,“良”,90-100,“优”)。 执行结果形式如下: sno cno Grade Classified grade --------- ---- ---------------- ------ 200215121 4 成绩为空! NULL . . . . . . 200215126 6 不及格 55 200215122 2 良 80 200215122 1 优 92 (11 行受影响) SELECT Sno,Cno,Grade, CASE WHEN Grade<60 THEN '不及格' WHEN Grade>=60 AND Grade<=70 THEN '及格' WHEN Grade>70 AND Grade<=80 THEN '中' WHEN Grade>80 AND Grade<=90 THEN '良' WHEN Grade>90 AND Grade<=100 THEN '优' ELSE '没有成绩' END AS '成绩等级' FROM SC; (2)用Transact-SQL语言编写程序计算1~100之间所有能被7整除的数的总和。 DECLARE @i int DECLARE @s int SET @i=1 SET @s=0 WHILE @i<=100 BEGIN IF(@i%7=0) SET @s+=@i SET @i+=1 END PRINT '总和:'+CAST(@s AS char(10)) (3)*自选实例,实践并掌握Transact-SQL以下控制流语言的使用方法: 例子1:求十以内的奇数积 DECLARE @i int,@s int SET @i=1 SET @s=1 WHILE(@i<=10) BEGIN SET @s*=@i SET @i+=2; END PRINT '10以内的奇数积:'+CAST(@s AS char(10)) 例子2: -- 由于BEGIN...END, WHILE, BREAK, CONTINUE, IF...ELSE在前面的题目中都已经做过了,这里就演示waitFor --方法1 BEGIN --该语句将会在18:00的时候执行 WAITFOR TIME '18:00'; UPDATE SC SET Grade+=10; END; --方法2 BEGIN -- 该语句会在2小时后执行 WAITFOR DELAY '02:00' UPDATE SC SET Grade+=10 END
(4)*自选实例,实践并掌握以下Transact-SQL语句: /*这是一段注释*/ -- 这也是一段注释 -- 以上两句注释可以执行,但是没有任何作用,也不会有任何影响 --下面是1-100的求和 DECLARE @s int, @i int SET @s=0 SET @i=1 WHILE @i <= 100 BEGIN SET @s=@s+@i SET @i=@i+1; END PRINT '1-100的总和:'+CAST(@s AS char(10)) 4. 创建存储过程printgrade,输入课程号,能按如下格式显示该课程的学生成绩单,并输出选修该课程的学生人数,如果输入的课程号不存在,用RAISERROR('输入错误,没有该课程号!', 16, 1)函数进行出错处理。(要求在存储过程中使用游标技术) 课程号:1 课程名:数据库 ____________________________________ 200215121 李勇 92 200215122 刘晨 92 200215125 张立 null CREATE PROCEDURE printgrade(@cno int) AS BEGIN DECLARE @sno varchar(10),@grade int,@cname varchar(20),@sname varchar(20) DECLARE stu CURSOR FOR SELECT Student.Sno,Student.Sname,SC.Grade FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Cno=@cno UPDATE SC SET Cno=@cno WHERE Cno=@cno IF(@@ROWCOUNT=0) RAISERROR('输入错误,没有该课程号!', 16, 1) ELSE BEGIN SELECT @cname=Cname FROM Course,SC WHERE SC.Cno=Course.Cno AND Course.Cno=@cno PRINT '课程号:'+CAST(@cno AS char(3))+' '+'课程名:'+@cname PRINT '---------------------------------------' OPEN stu FETCH NEXT FROM stu INTO @sno,@sname,@grade WHILE @@FETCH_STATUS=0 BEGIN PRINT @sno+' '+@sname+' '+CAST(@grade AS char(3)) FETCH NEXT FROM stu INTO @sno,@sname,@grade END CLOSE stu DEALLOCATE stu END END EXECUTE printgrade 2; 5. 调用该存储过程并输出“1”号课程的成绩单和选修该课程的学生人数。执行结果的形式如下: 课程号:1 课程名:数据库 ____________________________________ 200215121 李勇 92 200215122 刘晨 92 200215125 张立 null
1号课的选修人数为:3 或者 消息50000,级别16,状态1,过程printgrade,第11 行 输入错误,没有该课程号! 输入的课程号不存在! CREATE PROCEDURE printgrade2(@cno int) AS BEGIN DECLARE @sno varchar(10),@grade int,@cname varchar(20),@sname varchar(20),@num int DECLARE stu CURSOR FOR SELECT Student.Sno,Student.Sname,Sc.Grade FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Cno=@cno UPDATE SC SET Cno=@cno WHERE Cno=@cno SET @num=@@ROWCOUNT IF(@num=0) RAISERROR('输入的课程号不存在!', 16, 1) ELSE BEGIN SELECT @cname=Cname FROM Course,SC WHERE SC.Cno=Course.Cno AND Course.Cno=@cno PRINT '课程号:'+CAST(@cno AS char(3))+' '+'课程名:'+@cname PRINT '---------------------------------------' OPEN stu FETCH NEXT FROM stu INTO @sno,@sname,@grade WHILE @@FETCH_STATUS=0 BEGIN PRINT @sno+' '+@sname+' '+CAST(@grade AS CHAR(3)) FETCH NEXT FROM stu INTO @sno,@sname,@grade END CLOSE stu DEALLOCATE stu END PRINT CAST(@cno AS CHAR(2))+'号课的选修人数:'+CAST(@num AS CHAR(10)) END EXECUTE printgrade2 3; 6. 附加题: 用 @@ERROR 检测INSERT 和 DELETE 语句的成功操作与否。 INSERT Student VALUES('32134165','xxxx',21,'CS') SELECT @@ERROR 错误信息 INSERT Student VALUES('32134165','xxxx','男',21,'CS') SELECT @@ERROR 错误信息 DELETE FROM Student WHERE Sname='xxxx' SELECT @@ERROR 错误信息 |