注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Bioinformatics home

 
 
 

日志

 
 

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

2010-07-19 01:54:33|  分类: SQL |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

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

 

--> Author : wufeng4552

 

--> Date   : 2010-03-30

 

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…ELSEIF…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'说明

 

不能指定日期值.

 

 

  评论这张
 
阅读(897)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017