实验六:语法元素、流程控制与游标

实验内容与完成情况(记录所有的实验过程):

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 三次方

实验六:语法元素、流程控制与游标_第1张图片

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语句或Transact-SQL程序

(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张图片

(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以下控制流语言的使用方法:
BEGIN...END、WHILE、BREAK、CONTINUE、IF...ELSE、WAITFOR

例子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语句:
/*...*/(注释)、--(注释)、PRINT

/*这是一段注释*/

-- 这也是一段注释

-- 以上两句注释可以执行,但是没有任何作用,也不会有任何影响

--下面是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;

实验六:语法元素、流程控制与游标_第3张图片

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;

实验六:语法元素、流程控制与游标_第4张图片

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 错误信息

你可能感兴趣的:(数据库实验)