-- 上课内容:第五单元 T-SQL语言 (流程控制语句)
-- 5.5 流程控制语句
-- 5.5.1 IF ...ELSE 语句
-- 用于在执行 Transact-SQL 语句时强加条件的条件判断语句。
-- 语法:
IF Boolean_expression{ sql_statement | statement_block }
[ELSE{ sql_statement | statement_block } ]
IF 条件
条件满足时执行某个Transact-SQL 语句
[ELSE
条件不满足时执行某个Transact-SQL 语句]
-- 例1:
if 26>25
print '26>25 条件满足'
else
print '26
if 21>25
print '21 else
print '21>25 条件不满足'
-- ELSE 子句可选
if 26>25
print '26>25 条件满足'
if 21>25
print '21
-- 例2:
if 21>25
print '21 print '条件满足'
else
print '21>25'
print '条件不满足'
-- 显示出错,必须要把一起执行的语句放在一个begin end里
-- 5.5.2 BEGIN ...END 语句
-- 用于将多个 Transact-SQL 语句组合为一个逻辑块。
-- 任何时候当控制流语句必须执行一个包含两条或两条以上 Transact-SQL 语句的语句块时,请使用 BEGIN 和 END 语句。
--语法 :
BEGIN
{ sql_statement | statement_block }
END
if 21>25
BEGIN
print '21 print '条件满足'
END
else
BEGIN
print '21>25'
print '条件不满足'
END
-- 5.5.3 WHILE...BREAK...CONTINUE 语句
-- 只要指定的的条件为真,则 WHILE 语句重复语句或语句块。
-- 有两条 Transact-SQL 语句通常与 WHILE 同时使用:BREAK 或 CONTINUE。
-- BREAK 语句退出最内层 WHILE 循环,CONTINUE 语句重新开始 WHILE 循环。
-- 如果没有其它行可以处理,则程序可能执行 BREAK 语句。如果要继续执行代码,则可执行 CONTINUE 语句。
-- 语法:
WHILE Boolean_expression
{ sql_statement | statement_block }
[ BREAK ]
{ sql_statement | statement_block }
[ CONTINUE ]
-- 例3:
-- 显示最终结果:
declare @i int
declare @j int
select @i=1,@j=1
while @i begin
set @j=@i*@j
set @i=@i+1
end
select @i-1 as 'de ',@j as 'jicheng '
-- 显示每个步骤的结果:
declare @i int
declare @j int
select @i=1,@j=1
while @i begin
set @j=@i*@j
set @i=@i+1
select @i-1 as 'de ',@j as 'jicheng '
end
-- 例4:BREAK CONTINUE的用法
declare @i int
declare @j int
select @i=1,@j=1
while @i begin
set @j=@i*@j
set @i=@i+1
if @i=3
break
else
continue
end
select @i-1 as 'de ',@j as 'jicheng '
-- 5.5.4 CASE 语句
-- 在pubs数据库authors表中,在不改变表内数据的前提下,显示州的全拼
-- 例5:
SELECT au_id,au_lname,'StateName'
=CASE
WHEN state='CA' THEN 'California'
WHEN state='KS' THEN 'Kansas'
WHEN state='TN' THEN 'Tennessee'
WHEN state='OR' THEN 'Oregon'
END
FROM authors
-- 例6:
SELECT au_id,au_lname,
StateName=CASE state
WHEN 'CA' THEN 'California'
WHEN 'KS' THEN 'Kansas'
WHEN 'TN' THEN 'Tennessee'
WHEN 'OR' THEN 'Oregon'
END
FROM authors
-- 例7:
SELECT au_id,au_lname,
CASE state
WHEN 'CA' THEN 'California'
WHEN 'KS' THEN 'Kansas'
WHEN 'TN' THEN 'Tennessee'
WHEN 'OR' THEN 'Oregon'
END AS StateName
FROM authors
-- 5.5.5 GOTO 语句
-- 将执行流变更到标签处。
-- 跳过 GOTO 之后的 Transact-SQL 语句,在标签处继续处理。
-- GOTO 语句和标签可在过程、批处理或语句块中的任何位置使用。
-- GOTO 语句可嵌套使用。
-- 例8:用goto 语句来替换while语句的操作,完成例3的功能
declare @i int
declare @j int
select @i=1,@j=1
lab:
set @j=@i*@j
set @i=@i+1
if @i goto lab
else
select @i-1 as 'de ',@j as 'jicheng '
-- 5.5.6 WAITFOR 语句
-- 指定触发语句块、存储过程或事务执行的时间、时间间隔或事件。
-- 语法:
WAITFOR { DELAY 'time' | TIME 'time' }
-- 例9:等待3秒执行查询
WAITFOR DELAY '0:0:3'
select * from authors
-- 例10:等到某一时间执行查询
WAITFOR TIME '19:10'
select * from authors
-- 5.5.7 RETURN 语句
-- 例11:
if 1>2
print '条件正确'
else
begin
print '条件 '
return
print '出错 '
end
准备工作:
create table stu_info
(
t_number char(8),
t_name char(10),
t_gender char(2),
t_birthday datetime
)
create table course
(
c_number char(6),
c_name char(20),
c_credit int,
c_hour int,
c_teacher char(10)
)
create table exam
(
t_number char(8),
c_number char(6),
t_grade decimal(5,2)
)
insert into stu_info values('20040301','张华','女','19840113')
insert into stu_info values('20040302','王立','男','19830624')
insert into stu_info values('20040303','蒋超','男','19841115')
insert into stu_info values('20040304','王浩雨','男','19851020')
insert into stu_info values('20040305','张静','女','19840418')
insert into stu_info values('20050301','李华','女','19830113')
insert into stu_info values('20050302','张立','男','19840624')
insert into stu_info values('20050303','黄超','男','19851125')
insert into stu_info values('20050304','汪雨','男','19861020')
insert into stu_info values('20050305','王静','女','19850418')
--向course表插入数据
insert into course values('100101','高等数学',2,60,'赵金')
insert into course values('100102','大学英语',3,80,'王维')
insert into course values('100103','大学物理',2,60,'李华')
insert into course values('100104','大学英语',4,80,'刘杰')
insert into course values('100105','大学英语',NULL,80,'刘杰')
--向exam表插入数据
insert into exam values('20040301','100101',79)
insert into exam values('20040301','100102',88)
insert into exam values('20040302','100101',90)
insert into exam values('20040302','100103',75)
insert into exam values('20040303','100101',79)
insert into exam values('20040303','100102',75)
insert into exam values('20040303','100103',95)
insert into exam values('20040304','100102',43)
insert into exam values('20040304','100103',68)
insert into exam values('20040305','100101',64)
insert into exam values('20040305','100102',87)
insert into exam values('20040305','100103',92)
-- 练习:
-- 1. 声明2个变量 i int ,j int 分别给 i,j 赋值为 25,35,根据实际情况显示 'i>j' 或 'i
-- 2. 查询显示exam表,使t_grade >=90 显示 优;
-- 80 -- 70 -- 60 -- t_grade
-- 3. 用while循环语句来完成1加到10
-- 4. 用goto语句来完成1加到10
-- 练习参考答案:
-- 1. 声明2个变量 i int ,j int 分别给 i,j 赋值为 25,35,根据实际情况显示 'i>j' 或 'i declare @i int
declare @j int
select @i=25,@j=35
if @i>@j
print 'i>j'
else
print 'i
-- 2. 查询显示exam表,使t_grade >=90 显示 优;
-- 80 -- 70 -- 60 -- t_grade
SELECT t_number,c_number,t_grade,'等级'=
CASE
WHEN t_grade>=90 THEN '优'
WHEN t_grade>=80 and t_grade WHEN t_grade>=70 and t_grade WHEN t_grade>=60 and t_grade ELSE '不及格'
END
FROM exam
-- 3. 用while循环语句来完成1加到10
declare @i int,@j int
set @i=1
set @j=0
while @i begin
set @j=@j+@i
set @i=@i+1
end
print @j
-- 4. 用goto语句来完成1加到10
declare @i int,@j int
set @i=1
set @j=0
lab:
set @j=@j+@i
set @i=@i+1
if @i goto lab
else
print @j