SQL Server的程序设计Word文件下载.docx
《SQL Server的程序设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《SQL Server的程序设计Word文件下载.docx(29页珍藏版)》请在冰豆网上搜索。
✷流程控制语句
✷批处理
10.1变量
Transact-SQL中可以使用两种变量:
局部变量和全局变量。
10.1.1局部变量
局部变量是用户可自定义的变量,它的作用范围仅在程序内部。
在程序中通常用来储存从表中查询到的数据,或当作程序执行过程中暂存变量使用。
局部变量必须以@开头,而且必须先用DECLARE命令声明后才可使用。
其说明形式如下:
DECLARE@变量名变量类型[,@变量名变量类型…]
在使用DECLARE命令声明以后,所有的变量都被赋予初值NULL
例:
声明一个变量
Declare@ichar(5)
可以在一个declare语句中声明多个变量
例:
declare@iint,@jint,@kint
在Transact-SQL中不能像在一般的程序语言中一样使用“变量=变量值”来给变量赋值,必须使用SELECT或SET命令来设定变量的值。
其语法如下:
SELECT@变量名=变量值
SET@变量名=变量值
【注意】:
SET与SELECT的区别
下表列出SET与SELECT的区别:
set
select
同时对多个变量同时赋值
不支持
支持
表达式返回多个值时
出错
将返回的最后一个值赋给变量
表达式未返回值
变量被赋null值
变量保持原值
下面以具体示例来说明问题:
createtablechinadba1(
useridint,
addrvarchar(128)
)
insertintochinadba1(userid,addr)values(1,'
addr1'
insertintochinadba1(userid,addr)values(2,'
addr2'
insertintochinadba1(userid,addr)values(3,'
addr3'
1.同时对多个变量同时赋值,使用set赋值
declare@addr1varchar(60),@addr2varchar(60)
set@addr1='
aaa'
@addr2='
bbb'
'
'
附近有语法错误。
同时对多个变量同时赋值,使用select赋值
select@addr1='
2.表达式返回多个值时,使用SET赋值
declare@addrvarchar(128)
set@addr=(selectaddrfromchinadba1)
/*
--出错信息为
服务器:
消息512,级别16,状态1,行2
子查询返回的值多于一个。
当子查询跟随在=、!
=、<
、<
=、>
、>
=之后,或子查询用作表达式时,这种情况是不允许的。
*/
表达式返回多个值时,使用SELECT赋值
select@addr=addrfromchinadba1
print@addr--结果集中最后一个addr列的值
--结果:
addr3
3.表达式未返回值时,使用SET赋值
set@addr='
初始值'
set@addr=(selectaddrfromchinadba1whereuserid=4)
print@addr
表达式未返回值时,使用SELECT赋值
select@addr=addrfromchinadba1whereuserid=4
print@addr--保持原值
声明一个长度为8个字符的变量id,并赋值。
declare@idchar(8)或者declare@idchar(8)
select@id=‘10010001’set@id=‘10010001’
declare@idchar(8)declare@idchar(8)
Select@id=snoset@id=(selectsno
FromstudentFromstudent
Wheresname=‘张三’Wheresname=‘张三’)
不能将SELECT语句的赋值功能和查询功能同时混合使用,否则系统会产生错误。
Declare@iint,@jint
select@i=max(grade),@j=min(grade)
Fromsc
select@i=max(grade),@j=min(grade),max(grade)-min(grade)
from产品
10.1.2全局变量
全局变量是SQLServer系统内部使用的变量,其作用范围并不局限于某一程序,而是任何程序均可随时调用。
全局变量通常存储一些SQLServer的配置设定值和效能统计数据。
用户可在程序中用全局变量来测试系统的设定值或Transact-SQL命令执行后的状态值。
使用全局变量注意:
(1)全局变量不是由用户的程序定义的,它们是在服务器级定义的
(2)用户只能使用预先说明及定义的全局变量。
(3)引用全局变量时必须以“@@”开头。
(4)局部变量的名称不能与全局变量的名称相同,否则会在应用中出错。
如:
@@CONNECTIONS:
返回自SQLSERVER最近一次启动以来连接或企图连接到SQLSERVER的连接数目。
@@ERROR:
返回执行T-SQL语句的错误代码。
在SQLServer执行完一条语句后,如果执行成功,则返回@@ERROR的值为0,如果该语句在执行过程中发生错误,则将返回错误信息,而@@ERROR将返回相应的错误编号,该编号一直保持下去,直到下一条语句得到执行为止。
@@IDENTITY:
返回最后插入行的标识列的列值.
10.2注释符
--用于单行注释
与C语言相同的程序注释符号,即“/*……*/”,/*用于注释文字的开头,*/用于注释文字的结尾,可在程序中标识多行文字为注释。
10.3运算符
10.3.1算数运算符
两个数相加。
这个加法算术运算符也可以将一个以天为单位的数字加到日期中。
A.使用加法运算符计算客户总的可订购量
下面的示例将产品表中当前库存量和当前已定购的以及再订购的所有产品的数量相加。
select产品名称,
库存量+订购量+再订购量总的可订购量
from产品
B.使用加法运算符将天数加到日期和时间值中
下面的示例将若干天数加到datetime日期上。
DECLARE@startdatedatetime,@adddaysint
SET@startdate='
2007-3-12'
SET@adddays=5
select@startdatestartdate,@startdate+@adddaysadddate
C.将字符和整型数据类型相加
本示例通过将字符数据类型转换为int,将int数据类型值与字符值相加。
如果在char字符串中有无效的字符,则SQLServer将返回错误。
DECLARE@addvalueint
SET@addvalue=15
SELECT'
125127'
+@addvalue
下面是结果集:
125142
10.3.2赋值运算符
赋值运算符只有一个,即=(等号),用于为字段或变量赋值。
下面的语句先定义一个int变量@xyz,然后将其值赋为123。
declare@xyzint
set@xyz=123
10.3.3位运算符
位运算符用于在两个数之间执行位操作,T-SQL的位运算符如表所示。
位运算符的操作数可以是整型或二进制数据类型(binary和varbinary,但不包括image数据类型)的任何数据,并且,两个操作数不能同时是二进制数据。
下表列出了位运算支持的操作数数据类型。
位运算支持的操作数数据类型
10.3.4比较运算符
比较运算符用于测试两个表达式是否相等,除了text、ntext或image数据类型的表达式外,比较运算符还可用于其他所有类型的表达式。
比较运算符运算结果为布尔数据(TRUE或FALSE)下表列出了比较运算符及其含义。
10.3.5逻辑运算符
逻辑运算符用于对某个条件进行测试,和比较运算符一样,逻辑运算的运算结果为布尔数据(TRUE或FALSE)。
下表列出了逻辑运算符及其含义。
10.3.6字符串串联连接符
字符串连接运算是指使用加号(+)将两个字符串连接成一个字符串,加号作为字符串连接符。
'
abc'
+'
123'
结果为'
abc123'
。
10.3.7运算符的优先顺序
如果一个表达式中使用了多种运算符,则运算符的优先顺序决定计算的先后次序。
计算时,从左向右计算,先计算优先级高的运算,再计算优先级低的运算。
下面列出了运算符的顺序。
括号
算术运算符
比较运算符
按位运算符
逻辑运算符
赋值运算符
10.4函数
10.4.1数学函数
数学函数通常对作为参数提供的输入值执行计算,并返回一个数字值。
常用的数学函数
(1)取近似值函数
CEILING
返回>
=表达式的最小整数,返回的数据类型与表达式相同.
语法:
CEILING(numeric表达式)
例:
ceiling(123.45)124
ceiling(-123.45)-123
ceiling(123)123
FLOOR
返回<
=表达式的最大整数,返回的数据类型与表达式相同.
FLOOR(numeric表达式)
floor(123.45)123
floor(-123.45)-124
floor(123)123
ROUND
返回数字表达式并四舍五入为指定的长度或精度.返回与表达式相同的类型。
ROUND(numeric表达式,length[,function])
参数:
length
是numeric表达式将要四舍五入的精度。
当length为正数时,numeric表达式四舍五入为length所指定的小数位数。
当length为负数时,numeric表达式则按length所指定的在小数点的左边四舍五入。
function
是要执行的操作类型。
function必须是tinyint、smallint或int。
如果省略function或function的值为0(默认),numeric表达式将四舍五入。
当指定0以外的值时,将截断numeric表达式。
ROUND(748.58,1)748.60
ROUND(748.58,2)748.58
ROUND(748.58,3)748.58
ROUND(748.58,-1)750.00
ROUND(748.58,-2)700.00
ROUND(748.58,-3)1000.00
如果length是负数且大于小数点前的数字个数,ROUND将返回0。
ROUND(748.58,-4)0.00
ROUND(534.56,1)--结果为
ROUND(534.56,-1)--结果为
ROUND(534.56,-2)--结果为
ROUND(534.56,-3)--结果为
ROUND(534.56,-4)--结果为
ROUND(123.9995,3)--结果为
使用ROUND截断
下例使用两个SELECT语句说明四舍五入和截断之间的区别。
ROUND(150.75,1)150.80
ROUND(150.75,1,0)150.80--四舍五入结果
ROUND(150.75,1,1)150.70--截断结果
(2)取绝对值函数
ABS
返回给定数字表达式的绝对值。
返回与表达式相同的类型。
ABS(表达式)
ABS(-1.0)1.0
ABS(0.0)0.0
ABS(1.0)1.0
(3)随机函数
RAND
返回0到1之间的随机float值。
不包括0和1。
RAND([seed])
Seed是给出种子值整型表达式(tinyint、smallint或int)。
随机数种子是用来打乱随机数的,没有它,你的随机数并不真正随机数.
种子与结果的关系是:
对于不同的种子,有不同的随机数
对于相同的种子,具有相同的随机数
产生指定范围的随机整数的公式为:
Y=FLOOR(RAND()*(上限-下限+1))+下限
例如:
产生10~30之间的随机整数(包括10和30)的公式为:
Y=FLOOR(RAND()*(30-10+1))+10
(4)其它函数
POWER
返回给定表达式乘指定次方的值。
返回类型与numeric表达式相同。
语法:
POWER(numeric表达式,y)
y可以是精确数字或近似数字数据类型类别的表达式(bit数据类型除外)。
power(2,2)4
power(2,3)8
SQUARE
返回给定表达式的平方。
返回float类型。
SQUARE(float表达式)
下例返回半径为1英寸、高为5英寸的圆柱容积。
DECLARE@hfloat,@rfloat
SET@h=5
SET@r=1
SELECTPI()*SQUARE(@r)*@h容积
SQRT
返回给定表达式的平方根。
SQRT(float_表达式)
完成
PI
返回PI的常量值。
PI()
10.4.2字符串函数
(1)字符转换函数
ASCII()
ASCII()函数返回字符表达式最左端字符的ASCII码值。
ASCII(character_expression)
在ASCII函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错。
ASCII(123)等价于SELECTASCII('
SELECTASCII(ABC)会提示列名‘ABC’无效的错误
ASCII('
)97
ABC'
)65
CHAR()
CHAR()函数用于将ASCII码转换为字符。
CHAR(character_expression)
如果没有输入0~255之间的ASCII码值,CHAR()函数会返回一个NULL值。
CHAR(65)A
CHAR(97)a
注释:
CHAR可用于将控制字符插入字符串中。
下表显示了一些常用的控制字符。
换行符和回车的区别?
回车是回到本行最前面,换行是换到下一行去。
一般情况下,回车换行同时用,就是到下一行的头上去.
这个东西的说法来自打字机,以前的打字机要新起一行的时候有两步:
1.打字的机头回到开始位置,这就是回车
2.纸张往上推进一行,这就是换行
现在电脑上的回车换行其实已经是个整体的概念了
declare@xint,@yint
set@x=4
set@y=5
if@x<
@y
print'
X<
Y'
+char(13)+'
你好'
Elseif@x>
X>
y'
你不好'
LOWER()
LOWER()函数把字符串全部转换为小写。
LOWER(character_expression)
lower('
djjAAAAjdj'
)
UPPER()
UPPER()函数把字符串全部转换为大写。
UPPER(character_expression)
upper('
STR()
STR()函数把数值型数据转换为字符型数据。
STR(<
float_expression>
[,length,[<
decimal>
]])
length指定返回的字符串的长度。
是总长度,包括小数点、符号、数字或空格。
如果没有指定长度,默认值为10。
必须是非负值。
指定长度应大于或等于数字的符号位数+小数点前的位数+小数点位数+小数点后的位数。
decimal指定返回的小数位数,即小数点右边的位数,默认为0,必须是非负值。
小数位数大于decimal值时,STR()函数将其下一位四舍五入。
如果<
float_表达式>
小数点前的位数超过了指定的长度,则返回指定长度的‘*’。
--普通的转换
declare@ifloat
set@i=12.1245
print'
看看结果'
+str(@i)
结果:
12
set@i=12.45
+str(@i,6,4)
结果:
12.450
--小数的四舍五入
set@i=12.456789
12.457
set@i=12345.45789
+str(@i,3,4)
***
小数点前的位数有5位,超过的总长度3,*的个数由总长度3决定
(2)去空格函数
LTRIM()
LTRIM()函数把字符串头部的空格去掉。
LTRIM(character_expression)
selectltrim('
kdjjjjjjj'
DECLARE@string_to_trimvarchar(60)
SET@string_to_trim='
Helloworld!
Thebeginning:
+LTRIM(@string_to_trim)
RTRIM()
RTRIM()函数把字符串尾部的空格去掉。
RTRIM(character_expression)
(3)取子串函数
LEFT()
LEFT()函数返回部分字符串。
LEFT(character_expression,integer_expression)
LEFT()函数返回的子串是从字符串最左边起到第integer_expression个字符的部分。
若integer_expression为负值,则返回错误。
declare@ivarchar(100),@jint
set@i='
从查询或过程中无条件退出后的语句'
set@j=5
printleft(@i,@j)
RIGHT()
RIGHT()函数返回部分字符串。
RIGHT<
character_expression>
<
integer_expression>
RIGHT()函数返回的子串是从字符串右边第integer_expression个字符起到最后一个字符的部分。
SUBSTRING
SUBSTRING()函数返回部分字符串。
SUBSTRING(expression,starting_position,length)
SUBSTRING()函数返回的子串是从字符串左边第starting_position个字符起length个字符的部分。
其中表达式可以是字符串或二进制串或含字段名的表达式。
SUBSTRING()函数不能用于TEXT和IMAGE数据类型。
selectsubstring('
abcdefghijk'
2,5)
返回字符串“abcdefghijk”的左边第2个字符起5个字符的部分
(4)字符串比较函数
CHARINDEX()
CHARINDEX()函数返回字符串中某个指定的子串出现的开始位置。
返回类型为int.
CHARINDEX(<
su