數據庫實驗——T-SQL編程

一、實驗目的
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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章