一、批處理:
<span style="font-size:12px;">SELECT * FROM Students
SELECT * FROM Student_course
UPDATE Student_course
SET Student_grade=Student_grade+2
GO
</span>
GO是批處理的標誌,表示SQL Server將這些T-SQL語句編譯爲一個執行單元,提高執行效率
一般是將一些邏輯相關的業務操作語句,放置在同一批中,這完全由業務需求和代碼編寫者決定
SQLServer規定:如果是建庫、建表語句、以及我們後面學習的存儲過程和視圖等,則必須在語句末尾添加 GO 批處理標誌
二、變量:
局部變量:
局部變量必須以標記@作爲前綴,如@age
局部變量的使用也是先聲明,再賦值
全局變量:
全局變量必須以標記@ @作爲前綴,如@@version
全局變量由系統定義和維護,我們只能讀取,不能修改全局變量的值
聲明局部變量
DECLARE @變量名 數據類型
例如:
DECLARE @name varchar(8)
DECLARE @seat int
賦值
SET @變量名 =值
SELECT @變量名 = 值
例如:
SET @name=‘張三’
SELECT @name=stuName FROM stuInfo
WHERE stuNo=‘s25302’
全局變量都使用兩個@標誌作爲前綴
變量 |
含義 |
@@ERROR |
最後一個T-SQL錯誤的錯誤號 |
@@IDENTITY |
最後一次插入的標識值 |
@@LANGUAGE |
當前使用的語言的名稱 |
@@MAX_CONNECTIONS |
可以創建的同時連接的最大數目 |
@@ROWCOUNT |
受上一個SQL語句影響的行數 |
@@SERVERNAME |
本地服務器的名稱 |
@@TRANSCOUNT |
當前連接打開的事務數 |
@@VERSION |
SQL Server的版本信息 |
參考語句
<span style="font-size:12px;">print 'SQL Server的版本'+@@VERSION
print '服務器的名稱: '+@@SERVERNAME
INSERT INTO Students(Student_id,Student_name,Student_sex,Student_classid)
VALUES(‘11003’,‘張三’,'男',‘2005022')
--如果大於0表示上一條語句執行有錯誤
print '當前錯誤號'+convert(varchar(5),@@ERROR)
GO
</span>
三、BEGIN…END語句
BEGIN
語句1
語句2
……
END
BEGIN…END
語句相當於其他語言中的複合語句,如JAVA語言中的{ }。它用於將多條T-SQL語句封裝爲一個整體的語句塊,即將BEGIN…END內的所有T-SQL語句視爲一個單元執行。
四、IF-ELSE語句
IF (條件)
BEGIN
語句1
語句2
……
END
ELSE
BEGIN
語句1
語句2
……
END -- ELSE是可選部分
--如果有多條語句,才需要BEGIN-END語句塊
表一
問題:
統計並顯示Course_id爲‘1001’的課程的平均分,如果平均分在70以上,顯示“成績優秀“,並顯示前三個最高的成績;如果在70以下,顯示“成績較差“,並顯示後三個最低的成績。
分析:
第一步,統計平均成績存入臨時變量;
第二步,用IF-ELSE判斷;
USE Student
GO
DECLARE @myavg float
SELECT @myavg=AVG (Student_grade)
FROM Student_course
WHERE Course_id='1001'
PRINT ‘本課程的平均成績' +convert(varchar,@myavg)
IF (@myavg>70)
BEGIN
PRINT ‘本課程成績優秀,前三個最高的成績爲:'
SELECT TOP 3 * FROM Student_course
WHERE Course_id='1001' ORDER BY Student_grade DESC
END
ELSE
BEGIN
PRINT ‘本課程成績較差,後三個最低的成績爲:'
SELECT TOP 3 * FROM Student_course
WHERE Course_id='1001' ORDER BY Student_grade
END
GO
五、WHILE循環語句
WHILE (條件)
BEGIN
語句1
語句2
……
BREAK
END --BREAK表示退出循環如果有多條語句,才需要BEGIN-END語句塊
問題:
表一中假定要給考試成績提分。提分規則很簡單,給沒達到85分的學生每人都加2分,看是否都達到85分以上,如果沒有全部達到85分以上,每人再加2分,再看是否都達到85分以上,如此反覆提分,直到所有人都達到85分以上爲止。
分析:
第一步,統計沒達到85分的人數;
第二步,如果有人沒達到,加分;
第三步,循環判斷。
DECLARE @n int
WHILE(1=1) --條件永遠成立
BEGIN
SELECT @n=COUNT(*) FROM Student_course
WHERE Student_grade<85 --統計沒達到85分的人數
IF (@n>0)
UPDATE Student_course --每人加2分
SET Student_grade=Student_grade+2
WHERE Student_grade<85
ELSE
BREAK --退出循環
END
print '加分後的成績如下:'
SELECT * FROM Student_course
六、
CASE-END多分支語句
CASE
WHEN 條件1 THEN 結果1
WHEN 條件2 THEN 結果2
……
ELSE 其他結果
END
問題:
根據表一採用美國的ABCDE五級打分制來顯示筆試成績。
A級: 90分以上
B級: 80-89分
C級: 70-79分
D級: 60-69分
E級: 60分以下
print 'ABCDE五級顯示成績如下:'
SELECT Student_id,
成績= CASE
WHEN Student_grade<60 THEN 'E'
WHEN Student_grade BETWEEN 60 AND 69 THEN 'D'
WHEN Student_grade BETWEEN 70 AND 79 THEN 'C'
WHEN Student_grade BETWEEN 80 AND 89 THEN 'B'
ElSE 'A'
END
FROM Student_course
練習:
則根據如下規則對學生成績進行反覆加分,直到平均分超過85分爲止。請編寫T-SQL語句實現。
90分以上: 不加分
80-89分: 加1分
70-79分: 加2分
60-69分: 加3分
60分以下: 加5分
SELECT * FROM Student_course --原始成績
SELECT AVG(Student_grade) FROM Student_course --原始平均成績
DECLARE @avg INT
WHILE(1=1)
BEGIN
UPDATE Student_course
SET Student_grade=
CASE
WHEN Student_grade<60 THEN Student_grade+5
WHEN Student_grade between 60 AND 69 THEN Student_grade+3
WHEN Student_grade between 70 AND 79 THEN Student_grade+2
WHEN Student_grade between 80 AND 89 THEN Student_grade+1
ELSE Student_grade
END
SELECT @avg=AVG(Student_grade) FROM Student_course
IF @avg>=85
BREAK
END
SELECT * FROM Student_course --加分後的成績
SELECT AVG(Student_grade) FROM Student_course --加分後平均成績
總結
變量的賦值有兩種方式:使用SET語句或SELECT語句。
輸出結果也有兩種方式:print語句和SELECT語句。
控制流語句提供了條件操作所需的順序和邏輯。
語句塊使用BEGIN…END。
批處理可以提高語句執行的效率,批處理結束的標誌是“GO”。