1 :运算符
运算符是用来指定要在一个或者多个表达式中执行操作的一种符号 . 下面简单介绍 :
算术运算符号
select + 2+ 2 --'+' 表示加法或者正號前面表示正號後面表示加號
select - 2+ 1 --'-' 表示減法或者負號前面表示負號後面表示減號
select - 2* 2 --'*' 表示乘法
select 13/ 5, 13.0/ 5 --'/' 表示除法注意兩個結果有何不同
select 13% 5 --'%' 表示取模 ( 取餘數 )
比較運算符
用於測試兩個表達式的值之間的關係,這種關係是指等於,大於,小於等等。
比較運算符幾乎使用所有的表達式 ( 除 text,ntext,image 等數據類型除外 )
if 3> 2
print '3>2'
select *
from student
where s_no> 20060206
邏輯運算符號
用於對某些條件進行測試返回值為 true 或 false. 包括 all,and,any,between,exists,like,not 等等 .
賦值運算符號
即“ = ”除了賦值操作外,賦值運算符還可以用於建立列標題和定義列值的表達式之間的關係。如 :
select
國家 = ' 中國 ' ,
s_no 學號 ,
s_name 姓名
from student
where s_no> 20060206
/*
國家 學號 姓名
---- -------- --------------------------------------------------
中國 20060207 赵智远
中國 20060208 王可
*/
字符串連接運算符
即“ + ”表示將兩個字符串連接起來形成一個新的字符串
select 'Hello' + ' wufeng'
位 運算符
位運算符表示在兩個操作數之間執行按位進行運算的符號,操作數必須為整型數據類型之一及二進制字符串數據類型
select 1 & 2 -- 邏輯與
select 1 | 2 -- 邏輯或
select 1 ^ 2 -- 邏輯異或
select ~ 2 -- 邏輯取非
2 :流程控制
語句塊一程序中一個相對獨立的執行單元,它由 begin …end 括起來而形成的代碼段。其中 begin 表示語句塊的開始 ,end 則表示語句塊的結束,可以嵌套定義。
2.1 IF 語句
在程序中,有的語句塊執行是有條件的,有時候需要在多個語句或者語句之間的執行作出選擇。 IF 是最基本的判斷控制語句。
2.1.1 IF 句型
-- 如果學號 "20060202" 成績 及格 則輸出姓名成績
DECLARE @no char ( 8), @name char ( 8), @avgrade numeric ( 3, 1)
SET @no = '20060202'
SELECT @name = s_name,
@avgrade = s_avgrade
From student
Where s_no = @no;
IF @avgrade>= 60.0
BEGIN
PRINT @name
PRINT @avgrade
END
GO
/*
王丫
88.8
*/
注意:關鍵字 go 不是 T-SQL 語句,而是 T-SQL 語句的結束符,客戶端程序不會將 GO
傳給服務器,它只是 SSMS 等客戶端程序代碼編輯器能夠識別的命令。也就是說 GO 是用於定義批處理的關鍵字,兩個 GO 之間的 T-SQL 語句便形成了一個批。其好處在與,他可以將代碼分成若干個小段,即使前一個小段運行失敗,其他的可能會繼續運行。
2.1.2 IF…ELSE… 句型
-- 如果學號 "20060202" 成績不及格則輸出姓名成績否則輸出學號
DECLARE @no char ( 8), @name char ( 8), @avgrade numeric ( 3, 1)
SET @no = '20060202'
SELECT @name = s_name, @avgrade = s_avgrade
From student
Where s_no = @no;
IF @avgrade< 60.0
BEGIN
PRINT @name
PRINT @avgrade
END
ELSE
PRINT @no
GO
/*
20060202
*/
2.1. 3 IF…ELSE IF … ELSE 句型
GO
DECLARE @no char ( 8), @name char ( 8), @avgrade numeric ( 3, 1)
SET @no = '20060202'
SELECT @name = s_name, @avgrade = s_avgrade
From student
Where s_no = @no;
IF @avgrade>= 90.0
PRINT ' 优秀 '
ELSE IF @avgrade>= 80.0
PRINT ' 良好 '
ELSE IF @avgrade>= 70.0
PRINT ' 中等 '
ELSE IF @avgrade>= 60.0
PRINT ' 及格 '
ELSE
PRINT ' 不及格 '
GO
/*
良好
*/
2. 2 CASE 結構
CASE 結構用與多出口的判斷情況。 CASE 結構實際上被當作一個函數執行,執行後都有一個返回值。有兩種類型
2.2.1 簡單式 case 函數
SELECT 学号 = s_no, 姓名及爱 ¦n=
CASE s_no -- 執行時先計算表示的值,
-- 然後將計算結果與 when 後面表達式比較
-- 如果相等則計算 then 後面的表達式,計算結果作為 case 函數返回值
-- 但是兩者表達式必須相同或者可以隱式轉換
WHEN '20060201' THEN ' 李好,游泳 '
WHEN '20060202' THEN ' 王丫,登山 '
WHEN '20060203' THEN ' 王智高,滑雪 '
WHEN '20060204' THEN ' 赵刚,支部书 ?'
WHEN '20060205' THEN ' 贾志,足球 '
WHEN '20060206' THEN ' 丽思,爱 ¦n 不详 '
WHEN '20060207' THEN ' 赵智远 ¡A 长 ¶]'
WHEN '20060208' THEN ' 王可,山地自行车 '
ELSE ' 没有这人 '
END
FROM student
2.2.1 搜索式 case 函數
SELECT 学号 = s_no,
姓名 = s_name,
成绩 µ¥ 级 =
CASE
/* 搜索式 case 函數中 , 關鍵字 case 後面沒有表達式 , 且 when 後面的表達式
已被限定為布爾表達式 ( 返回 true 或 false), 執行時從上到下依次計算每個
when 後面表達式的值如果值為 true 則計算 then 後面表達式的值 , 並將該值作為
case 函數的返回值 , 如果所有 when 後面均為 false 則計算 else 後面表達式的值並
將其返回作為 case 函數的值 .
*/
WHEN s_avgrade> 90.0 THEN ' 优秀 '
WHEN s_avgrade> 80.0 THEN ' 良好 '
WHEN s_avgrade> 70.0 THEN ' 中等 '
WHEN s_avgrade> 60.0 THEN ' 及格 '
ELSE ' 不及格 '
END
FROM student
2.3 WHILE 語句 ( 含 Break,Continue)
GO
DECLARE @max numeric ( 3, 1), @avg numeric ( 3, 1)
SET @max = ( SELECT MAX ( s_avgrade) FROM student)
WHILE @max < 99
-- 在 while 語句中如果表達式的值為真就重複執行
-- 循環體內的語句 . 如果布爾表達式中有 select
-- 語句必須用括號將 select 語句括起來
BEGIN
UPDATE student
SET s_avgrade = s_avgrade + s_avgrade * 0.005
SET @max = ( SELECT MAX ( s_avgrade) FROM student)
SET @avg = ( SELECT MAX ( s_avgrade) FROM student)
if @avg> 76.0 break
-- 將執行到 break 語句時程序將無條件退出當前循環體 , 執行出現在 end
--( 循環體結束標記 ) 關鍵字後面的語句
if @avg> 74.0 continue
-- 當執行到 continue 語句時 , 程序將不執行 continue 語句後的所有語句
-- 提前結束本次循環 ( 並非退出循環 ), 並重新開始新的循環
print @avg
END
GO
2.4 GOTO 語句
GOTO 語句是一種無條件轉義語句,可以實現執行流程從一個地方轉到另外一個地方。
DECLARE @s int , @sum int
SET @s = 0
SET @sum = 0
label1:
/*
label1 為定義的標籤 , 他是 goto 語句轉義的依據 , 標籤必須符號命名規則
無論是否使用 goto 語句標籤均可以作為注釋方法使用 . 當執行語句執行到
"goto lablel1" 時執行流程將無條件的轉到標籤所指向的地址 , 並從該地址
依次往下執行所遇到的語句 .
*/
SET @s = @s + 1
SET @sum = @sum + @s
IF @s <> 100 GOTO label1
PRINT @sum
2.5 TRY…CATCH 語句
GO
DELETE FROM student
GO
BEGIN TRY
INSERT INTO student
Values ( '20060201' , N' 李好 ' , N' 男 ' , '1987-1-10' , N' 计算机应 ¥Î 技术 ' , 94.5, N' 计算机系 ' )
INSERT INTO student
Values ( '20060202' , N' 王丫 ' , N' 女 ' , '1987-2-23' , N' 计算机软 件 与理论 ' , 88.8, N' 计算机系 ' )
INSERT INTO student
Values ( '20060203' , N' 王智高 ' , N' 男 ' , '1986-121-25' , N' 网络 工 程 ' , 85.8, N' 信息工程系 ' )
END TRY
/*
當 try 塊內語句產生錯誤 ( 拋出異常 ) 則會將控制傳遞 catch 塊的第一個語句
當 try 塊所包含的語句沒有任何錯誤時 , 則在 try 塊中最後一個語句完成時後
將控制傳遞給緊跟在 end...catch 語句之後的語句
*/
BEGIN CATCH
PRINT N' 插入操作有错。 '
END CATCH ;
select * from student
2.6 RETURN 語句
Return 語句從過程,批處理,或者語句塊中無條件退出, return 之後的語句不被執行, return 之後可以跟整型表達式,當執行到 return 語句時先計算表達式的值
然後返回該值,如果 return 嵌入存儲過程該語句不能返回空值,否則生成警告信息並生成 0 值
select 1
return
select 2
2.7 waitfor 語句
格式為:
Waitfor { delay 'time_to_pass'
|
Time 'time_to_execute'
}
其中 ,
delay 子句用於設定 waitfor 語句所要等待的時間 ( 這個時間後執行後面的語句 ), 時間長短由後面 'time_to_pass' 指定 ( 只能包含時間格式最長 24H)
time 子句用於設定 waitfor 語句等待的終結時刻由參數 'time_to_execute' 說明
不能指定日期值 .