實驗內容與完成情況(記錄所有的實驗過程): 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 錯誤信息 |
實驗六:語法元素、流程控制與遊標
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.