您的位置:首页 > 数据库

T-SQL入门攻略之6-T-SQL运算符与流程控制

2010-10-22 14:22 369 查看
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'
說明

不能指定日期值
.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: