一、实验目的
1.掌握各种运算符和控制语句的使用;
2.掌握系统函数的使用;
3.掌握存储过程的实现。
二、实验学时
2学时
三、实验要求
1.了解T-SQL支持的各种基本数据类型及变量的使用;
2.了解T-SQL各种运算符、控制语句及函数的功能及使用方法;
3.掌握存储过程的编写和运行方法;
4.完成实验报告。
四、实验内容
以实验数据库为基础数据,完成以下内容
1.变量的使用
(1)创建局部变量@xh(char(9))并使用set将student表中“李勇”的学号字段赋给该变量,然后使用select显示变量的值;
DECLARE @xh char(9)
set @xh=
(SELECT sno
FROM XSKC.student
WHERE sname=‘李咏’)
SELECT @xh AS 学号;
(2)计算学生信息表student中学生最高年龄和最低年龄之差,并使用select将结果赋值给@cz,并使用print显示变量的值。
DECLARE @cz int
SELECT @cz=MAX(sage)-MIN(sage)
FROM XSKC.student
print @cz ;
2.应用内置函数
(1)求course表中课程号为“03”的课程名称的长度,并在消息提示框中输出结果。结果格式为:“03号课程名称的长度为:**”。
提示:使用CONVERT函数。
DECLARE @kclength char(10),@kc char(30)
set @kclength=
(SELECT cname
FROM XSKC.course
WHERE cno=‘3’ )
SELECT @kc=‘03号课程名称的长度为:’
SELECT @kc+STR(LEN(@kclength),1);
(2)使用字符串串联运算符“+”,将student表中的所有字段串联在一起用一个“学生信息”字段显示出来。
SELECT sno+’ ‘+sname+’ ‘+str(sage,2)+’ '+sdept as 学生信息
FROM XSKC.student;
3. 流程控制语句
(1)判断student表中是否存在编号为2005150026的学生,如果存在,则显示该学生基本信息;若不存在,则显示“查无此人”。
IF(SELECT sno FROM XSKC.student WHERE sno=‘2005150026’) = ‘2005150026’
BEGIN
SELECT *
FROM XSKC.student
WHERE sno=‘2005150026’
END
ELSE
PRINT ‘查无此人’;
(2)查询学号为“200515002”的学生的平均分是否超过了85分,若超过则输出“XX(学生姓名)考出了高分”,否则输出“XX(学生姓名)考的一般”。
DECLARE @name nvarchar(10)
SET @name=
(SELECT sname
FROM XSKC.student
WHERE sno=‘200515002’)
IF(SELECT AVG(grade) FROM XSKC.sc WHERE sno=‘200515002’) > 85
BEGIN
PRINT @name+‘考出了高分’
END
ELSE
PRINT @name+‘考得一般’;
4. 定义函数
(1)定义一个函数CHECK_SNO实现如下功能:对于一个给定的sno值,查询该值在sc表中是否存在,若存在则返回0,否则返回-1。
CREATE FUNCTION CHECK_SNO(@sno char(10))
RETURNS int AS
BEGIN
DECLARE @ret int
IF (SELECT sno FROM XSKC.sc WHERE sno=@sno) = @sno
SET @ret=0
ELSE
SET @ret=-1
RETURN @ret
END;
(2)写一段T-sql程序调用上述函数。当向sc表插入一行记录时,首先调用函数CHECK_SNO检索该记录的sno值在表student中是否存在对应值,若存在,则将该记录插入记录(‘200515023’,’02’,75)到sc表中。
DECLARE @sno int
SELECT @sno=dbo.CHECK_SNO(‘200515023’)
IF @sno=0
BEGIN
INSERT XSKC.sc
VALUES(‘200515023’,‘02’,75)
END;
(3)定义一函数,按系别统计当前所有学生的平均年龄,并调用该函数求出“CS”系学生的平均年龄。
CREATE FUNCTION AVER_DEPT(@dept char(3))
RETURNS int AS
BEGIN
DECLARE @aver int
SELECT @aver=
(SELECT AVG(sage)
FROM XSKC.student
WHERE sdept=@dept)
RETURN @aver
END
DECLARE @dept char(3)
SET @dept=‘CS’
SELECT dbo.AVER_DEPT(@dept);
5.存储过程
(1)创建一个无参存储过程pr_StuScore,查询以下信息:班级、学号、姓名、性别、课程名称、考试成绩。
CREATE PROCEDURE pr_StuScore
AS
BEGIN
SELECT sdept,XSKC.student.sno,sname,ssex,cname,grade
FROM XSKC.course,XSKC.sc,XSKC.student
WHERE XSKC.course.cno=XSKC.sc.cno AND XSKC.sc.sno=XSKC.student.sno
END;
(2)创建一个带参数的存储过程pr_StuScoreInfo2,该存储过程根据传入的学生编号和课程名称查询以下信息:班级、学号、姓名、性别、课程名称、考试成绩。
CREATE PROCEDURE pr_StuScoreInfo2(@sno char(10),@cname char(30) )
AS
SELECT sdept,XSKC.student.sno,sname,ssex,cname,grade
FROM XSKC.course,XSKC.sc,XSKC.student
WHERE XSKC.course.cno=XSKC.sc.cno AND XSKC.sc.sno=XSKC.student.sno AND XSKC.student.sno=@sno AND cname=@cname
EXEC pr_StuScoreInfo2 ‘200515002’,‘数据库’;
(3)创建一个带参数的存储过程pr_xxscore,该存储过程根据传入的学生编号和课程号,并通过变量输出该学生的课程成绩。
CREATE PROCEDURE pr_xxscore(@sno char(10),@cname char(30),@grade int output)
AS
SELECT @grade=grade
FROM XSKC.course,XSKC.sc
WHERE XSKC.course.cno=XSKC.sc.cno AND sno = @sno AND cname = @cname
DECLARE @score int
exec pr_xxscore ‘200515002’,‘操作系统’,@score output
SELECT @score;
(4)创建存储过程,通过给定两个学生的学号,比较两个学生的年龄,若前者比后者高就输出0,否则输出1。(调用时比较200515001号和200515002号的年龄)。
CREATE PROCEDURE age_compare(@onesno char(9),@twosno char(9),@LEGAL BIT OUTPUT)
AS
DECLARE @oneage int,@twoage int
SELECT @oneage = sage FROM XSKC.student WHERE sno=@onesno
SELECT @twoage = sage FROM XSKC.student WHERE sno=@twosno
IF @oneage>@twoage
SELECT @LEGAL=0
ELSE
SELECT @LEGAL=1
DECLARE @flag int
EXEC age_compare ‘200515001’,‘200515002’,@flag output
SELECT @flag;
(5)编写带参数的存储过程pr_cavg,根据传入的课程名称统计该课程的平均成绩。
CREATE PROCEDURE pr_cavg(@incname char(10))
AS
SELECT AVG(grade)
FROM XSKC.sc,XSKC.course
WHERE XSKC.sc.cno=XSKC.course.cno AND cname=@incname
exec pr_cavg ‘操作系统’;
(6)创建一存储过程pr_age,用于统计某年龄段所有学生的学号、姓名及所选课程信息。
CREATE PROCEDURE pr_age(@oneage int,@twoage int)
AS
SELECT XSKC.student.sno,sname,XSKC.course.cno,cname
FROM XSKC.course,XSKC.student,XSKC.sc
WHERE XSKC.course.cno=XSKC.sc.cno AND XSKC.sc.sno=XSKC.student.sno AND sage BETWEEN @oneage AND @twoage
EXEC pr_age 20,23;
(7)创建一个添加学生记录的存储过程stduentadd,用来给student表添加一条记录。(‘200515028’,‘徐小明’,‘男’,24,‘CS’)
CREATE PROCEDURE stduentadd
AS
INSERT
INTO XSKC.student
VALUES(‘200515028’,‘徐小明’,‘男’,24,‘CS’)
EXEC stduentadd;