SQL教程:流程控制
流程控制的定義
一般是指用來控制程序執(zhí)行和流程分至點額命令,一般指的是邏輯計算部分的控制。
流程控制種類
常見的流程控制有以下8種:
- BEGIN ... END
- WAITFOR
- GOTO
- WHILE
- IF ... ELSE
- BREAK
- RETURN
- CONTINUE 下面給大家具體介紹每種流程控制的用法。
BEGIN...END
BEGIN ... END語句用于將多個T-SQL語句合為一個邏輯塊。當(dāng)流程控制語句必須執(zhí)行一個包含兩條或兩條以上的T-SQL語句的語句塊時,使用BEGIN ... END語句。
語法
BEGIN
sql_statement...
END
示例
我們在數(shù)據(jù)庫中打印出我們公眾號的名稱"SQL數(shù)據(jù)庫開發(fā)"。
DECLARE @A VARCHAR(20)
SET @A='SQL數(shù)據(jù)庫開發(fā)'
BEGIN
SELECT @A
END
結(jié)果如下:
圖片
這里的SELECT @A就是一條被執(zhí)行的命令語句。
IF [...ELSE]
IF [...ELSE]表示可以只使用IF,也可以IF和ELSE一起使用,表示條件判斷。當(dāng)滿足某個條件使,就執(zhí)行IF 下面的語句,否則執(zhí)行ELSE下面的語句。
IF語法
IF <條件表達(dá)式>
{命令行 | 程序塊}
IF示例
如果某字符串的長度大于5,就打印該字符串。
DECLARE @A VARCHAR(20)
SET @A='SQL數(shù)據(jù)庫開發(fā)'
IF LEN(@A)>5
SELECT @A
結(jié)果:
圖片
這里結(jié)果與上面的BEGIN...END一樣,但是如果我們將條件改成大于8,結(jié)果可能就不是這樣的了,小伙伴們可以試一下。
IF...ELSE語法
IF <條件表達(dá)式>
{命令行 | 程序塊}
ELSE
{命令行 | 程序塊}
IF...ELSE示例
如果字符串的長度大于10,就打印該字符串,否則打印"字符串長度太短"。
DECLARE @A VARCHAR(20)
SET @A='SQL數(shù)據(jù)庫開發(fā)'
IF LEN(@A)>10
SELECT @A
ELSE
SELECT '字符串長度太短'
結(jié)果:
圖片
很明顯字符串"SQL數(shù)據(jù)庫開發(fā)"長度不大于10,所以返回ELSE里的結(jié)果了。
WHILE
WHILE是循環(huán)控制,當(dāng)滿足WHILE后面的條件后,就可以循環(huán)執(zhí)行WHILE下面的語句。通常與CONTINUE和BREAK一起使用,Break命令讓程序完全跳出循環(huán)語句,結(jié)束WHILE命令,CONTINUE是讓命令繼續(xù)返回執(zhí)行。
語法
WHILE <條件表達(dá)式>
{命令行 | 程序塊}
CONTINUE
{命令行 | 程序塊}
BREAK
{命令行 | 程序塊}
示例
有1到10這樣一組數(shù)字,從1按順序開始,遇到偶數(shù)就跳過,遇到奇數(shù)就打印出來,當(dāng)遇到9就結(jié)束打印。
DECLARE @i int;
SET @i = 0;
WHILE(@i < 10)
BEGIN
SET @i = @i + 1;
IF(@i % 2 = 0)
BEGIN
PRINT ('跳過偶數(shù)數(shù)'
+ CAST(@i AS varchar));
CONTINUE;
END
ELSE IF (@i = 9)
BEGIN
PRINT ('到' +
CAST(@i AS varchar) + '就結(jié)束打印');
BREAK;
END
PRINT @i;
END
結(jié)果如下:
圖片
我們只正常打印出來了1-3-5-7其他的不是跳過就是到9就結(jié)束了。
RETURN
RETURN語句用于使程序從一個查詢、存儲過程或批量處理中無條件返回,其后面的語句不再執(zhí)行。如果在存儲過程中使用return語句,那么此語句可以指定返回給調(diào)用應(yīng)用程序、批處理或過程的整數(shù);如果沒有為RETURN指定整數(shù)值,那么該存儲過程將返回0。
語法
RETURN [整數(shù)表達(dá)式]。
示例
BEGIN
PRINT(1);
PRINT(2);
RETURN ;
PRINT(3);
--在RETURN之后的代碼不會被執(zhí)行,
--因為會跳過當(dāng)前批處理
PRINT(4);
END
GO
BEGIN
PRINT(5);
END
結(jié)果如下:
圖片
RETURN后面的3-4都沒打印,說明在當(dāng)前批處理的RETURN后都沒執(zhí)行,而新起的BEGIN...END不受上面的RETURN影響,所以打印了5。
GOTO
GOTO命令用來改變程序執(zhí)行的流程,使程序跳轉(zhuǎn)到標(biāo)識符指定的程序行再繼續(xù)往下執(zhí)行。
GOTO命令雖然增加了程序設(shè)計的靈活性,但破壞了程序的結(jié)構(gòu)化,使程序結(jié)構(gòu)變得復(fù)雜而且難以測試。
注意:
- 語句標(biāo)識符可以是數(shù)字或者字母的組合,但必須以":"結(jié)束。而在GOTO語句后的標(biāo)識符不必帶":"。
- GOTO語句和跳轉(zhuǎn)標(biāo)簽可以在存儲過程、批處理或語句塊中的任何地方使用,但不能超出批處理的范圍。
語法
GOTO 標(biāo)識符。
示例
DECLARE @i INT;
SET @i = 1;
PRINT @i;
SET @i = 2;
PRINT @i;
GOTO ME;
SET @i = 3; --這行被跳過了
PRINT @i;
ME:PRINT('跳到我了?');
PRINT @i
結(jié)果如下:
圖片
從上面可以看出,當(dāng)跳到ME的時候,GOTO之前的數(shù)有打印,之后的數(shù)就跳過了。
WAITFOR
用于掛起語句的執(zhí)行,直到指定的時間點或者指定的時間間隔。
注意:
WAITFOR常用語某個特定的時間點或時間間隔自動執(zhí)行某些任務(wù)。在WAITFOR語句中不能包含打開游標(biāo),定義視圖這樣的操作。在包含事務(wù)的語句中不要使用WAITFOR語句,因為WAITFOR語句在時間點或時間間隔執(zhí)行期間將一直擁有對象的鎖,當(dāng)事務(wù)中包含WAITFOR語句,事務(wù)的其他語句又需要訪問被鎖住的數(shù)據(jù)對象事就容易發(fā)生死鎖現(xiàn)象。
指定時間點的語法
WAITFOR TIME <具體時間>。
示例
在'08:10:00'執(zhí)行打印字符串"SQL數(shù)據(jù)庫開發(fā)"。
WAITFOR TIME '08:10:00'
PRINT 'SQL數(shù)據(jù)庫開發(fā)'
如果你執(zhí)行這句話,那如果在今天這個點之前,那么等到這個時候它就會打印字符串,如果在今天這個點之后,那你需要等到第二天的這個時間點才會打印。在未執(zhí)行之前查詢窗口是一直"正在執(zhí)行查詢..."狀態(tài)
圖片
指定等待時間間隔的語法
WAITFOR DELAY 'INTERVAR'。
INTERVAR為時間間隔,指定執(zhí)行WAITFOR 語句之前需要等待的時間,最多為24小時。
示例
WAITFOR DELAY '00:00:03'
PRINT 'SQL數(shù)據(jù)庫開發(fā)'
在等到3秒鐘后,會打印出字符串。
圖片