T-SQL语言的组成
数据定义语言(DDL,Data Definition Language):SQL让用户定义存储数据的结构和组织,以及数据项之间的关系。
数据操纵语言(DML,Data Manipulation Language):SQL允许用户或应用程序通过添加新数据、删除旧数据和修改以前存储的数据对数据库进行更新。
数据控制语言(DCL,Data Control Language):可以使用SQL来限制用户检索、添加和修改数据的能力,保护存储的数据不被未授权的用户所访问。
数据检索语言:SQL允许用户或应用程序从数据库中检索存储的数据并使用它。
数据共享:可以使用SQL来协调多个并发用户共享数据,确保他们不会相互干扰。
数据完整性:SQL在数据库中定义完整性约束条件,使它不会由不一致的更新或系统失败而遭到破坏。
T-SQL语句结构
SELECT 子句 [INTO 子句] FROM 子句 [WHERE 子句] [GROUP BY 子句] [HAVING 子句] [ORDER BY 子句]
T-SQL常量
字符串常量
字符串常量定义在单引号内。
二进制常量
在Transact—SQL中定义二进制常量,需要使用0x,并采用十六进制来表示,不再需要括号。
例如,以下为二进制常量:
0xB0A1
0xB0C4
0xB0C5
BIT常量
在Transact—SQL中,bit常量使用数字0或1即可,并且不包括在引号中。如果使用一个大于1的数字,则该数字将转换为1。
日期和时间常量
定义日期和时间常量需要使用特定格式的字符日期值,并使用单引号。
例如,以下为日期和时间常量:
‘2012年10月9日’
‘15:39:15’
‘10/09/2012’
‘07:59 AM’
T-SQL变量
局部变量
局部变量是用户可自定义的变量,它的作用范围仅在程序内部。局部变量的名称是用户自定义的,命名的局部变量名要符合SQL Server标识符命名规则,局部变量名必须以@开头。
1.声明局部变量
局部变量的声明需要使用DECLARE语句。语法格式如下:
DECLARE @varaible_name datatype [ ,… n ]
参数说明:
@varaible_name:局部变量的变量名必须以@开头,另外变量名的形式必须符合SQL Server标识符的命名方式。
datatype:局部变量使用的数据类型可以是除text、ntext或者image类型外所有的系统数据类型和用户自定义数据类型。一般来说,如果没有特殊的用途,建议在应用时尽量使用系统提供的数据类型。这样做,可以减少维护应用程序的工作量。
全局变量
全局变量是SQL Server系统内部事先定义好的变量,不需要用户参与定义,对用户而言,其作用范围并不局限于某一程序,而是任何程序均可随时调用。全局变量通常用于存储一些SQL Server的配置设定值和效能统计数据。
SQL Server一共提供了30多个全局变量,本节只对一些常用变量的功能和使用方法进行介绍。全局变量的名称都是以**@@**开头的。
(1)@@CONNECTIONS
记录自最后一次服务器启动以来,所有针对这台服务器进行的连接数目,包括没有连接成功的尝试。
使用@@CONNECTIONS可以让系统管理员很容易地得到今天所有试图连接本服务器的连接数目。
(2)@@CPU_BUSY
记录自上次启动以来尝试的连接数,无论连接成功还是失败,都以ms为单位的CPU工作时间。
(3)@@CURSOR_ROWS
返回在本次服务器连接中,打开游标取出数据行的数目。
(4)@@DBTS
返回当前数据库中timestamp数据类型的当前值。
(5)返回执行上一条Transact-SQL语句所返回的错误代码。
在SQL Server服务器执行完一条语句后,如果该语句执行成功,将返回@@ERROR的值为0,如果该语句执行过程中发生错误,将返回错误的信息,而@@ERROR将返回相应的错误编号,该编号将一直保持下去,直到下一条语句得到执行为止。
由于@@ERROR在每一条语句执行后被清除并且重置,应在语句验证后立即检查它,或将其保存到一个局部变量中以备事后查看。
(6)@@FETCH_STATUS
返回上一次使用游标FETCH操作所返回的状态值,且返回值为整型。
返回值描述如表。
(7)@@IDENTITY
返回最近一次插入的identity列的数值,返回值是numeric。
(8)@@IDLE
返回以ms为单位计算SQL Server服务器自最近一次启动以来处于停顿状态的时间。
(9)@@IO_BUSY
返回以ms为单位计算的SQL Server服务器自最近一次启动以来花在输入和输出上的时间。
(10)@@LOCK_TIMEOUT
返回当前对数据锁定的超时设置。
(11)@@PACK_RECEIVED
返回SQL Server服务器自最近一次启动以来一共从网络上接收数据分组的数目。
(12)@@PACK_SENT
返回SQL Server服务器自最近一次启动以来一共向网络上发送数据分组的数目。
(13)@@PROCID
返回当前存储过程的ID标识。
(14)@@REMSERVER
返回在登录记录中记载远程SQL Server服务器的名字。
(15)@@ROWCOUNT
返回上一条SQL语句所影响到数据行的数目。对所有不影响数据库数据的SQL语句,这个全局变量返回的结果是0。在进行数据库编程时,经常要检测@@ROWCOUNT的返回值,以便明确所执行的操作是否达到了目标。
(16)@@SPID
返回当前服务器进程的ID标识。
(17)@@TOTAL_ERRORS
返回自SQL Server服务器启动来,所遇到读写错误的总数。
(18)@@TOTAL_READ
返回自SQL Server服务器启动来,读磁盘的次数。
(19)@@TOTAL_WRITE
返回自SQL Server服务器启动来,写磁盘的次数。
(20)@@TRANCOUNT
返回当前连接中,处于活动状态事务的数目。
(21)@@VERSION
返回当前SQL Server服务器安装日期、版本,以及处理器的类型。
注释符(Annotation)
注释语句不是可执行语句,不参与程序的编译,通常是一些说明性的文字,对代码的功能或者代码的实现方式给出简要的解释和提示。
在Transact-SQL中,可使用两类注释符:
ANSI标准的注释符(–),用于单行注释;例如下面SQL语句所加的注释。
use master --打开数据表
与C语言相同的程序注释符号,即“/”、“/”,“/”用于注释文字的开头,“/”用于注释文字的结尾,可在程序中标识多行文字为注释。例如有多行注释的SQL语句如下:
use student
declare @songname char(10)
select @songname=课程内容 from course where 课程类别=‘艺术类’
print @songname
/打开student数据库,定义一个变量
把查询到的结果赋值给所定义的变量/
说明:
把所选的行一次都注释的快捷键是:Shift+Ctrl+C;一次取消多行注释的快捷键是:Shift+Ctrl+R。
运算符(Operator)
运算符是一种符号,用来进行常量、变量或者列之间的数学运算和比较操作,它是Transact-SQL语言很重要的部分。运算符有几种类型分别为:算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、连接运算符。
1.算术运算符
算术运算符在两个表达式上执行数学运算,这两个表达式可以是数字数据类型分类的任何数据类型。算术运算符包括:+(加)、-(减)、×(乘)、/(除)、%(取余)。
注意:
取余运算两边的表达式必须是整型数据。
2.赋值运算符
T-SQL 有一个赋值运算符,即等号 (=)。在下面的示例中,创建了@songname变量。然后利用赋值运算符将 @songname 设置成一个由表达式返回的值。代码如下:
DECLARE @songname char(20)
SET @songname=‘loving’
还可以使用SELECT语句进行赋值,并输出该值。
DECLARE @songname char(20)
SELECT @songname =‘loving’
print @songname
3.比较运算符
比较运算符测试两个表达式是否相同。除了 text、ntext 或 image 数据类型的表达式外,比较运算符可以用于所有的表达式。比较运算符包括:>(大于)、<(小于)、=(等于)、>=(大于等于)、<=(小于等于)、!=(不等于)、!>(不大于)、!<(不小于),其中!=、!>、!<不是ANSI标准的运算符
比较运算符的结果是布尔数据类型有3种值:TRUE、FALSE及UNKNOWN。那些返回布尔数据类型的表达式被称为布尔表达式。
和其他SQL Server 数据类型不同,不能将布尔数据类型指定为表列或变量的数据类型,也不能在结果集中返回布尔数据类型。
4.逻辑运算符
逻辑运算符对某个条件进行测试,以获得其真实情况。逻辑运算符和比较运算符一样,返回带有TRUE或FALSE值的布尔数据类型。
SQL支持的逻辑运算符
5.位运算符
位运算符的操作数可以是整数数据类型或二进制串数据类型(image数据类型除外)范畴的。SQL支持的按位运算符。
6.字符串连接运算符
连接运算符“+”用于连接两个或两个以上的字符或二进制串、列名或者串和列的混合体,将一个串加入到另一个串的末尾。语法如下:
<expression1>+<expression2>
7.运算符优先级
当一个复杂表达式中包含有多个运算符时,运算符的优先级决定了表达式计算和比较操作的先后顺序。运算符的优先级由高到低的顺序如下:
(1)+(正)−(负)~(位反)
(2)*(乘)/(除)%(取余)
(3)+(加)+(字符串串联运算符)-(减)
(4)=、>、<、>=、<=、<>、!=、!>、!<(比较运算符)
(5)^(按位异或)&(按位与)| (按位或)
(6)NOT
(7)AND
(8)ALL ANY BETWEEN IN LIKE OR SOME(逻辑运算符)
(9)=(赋值)
若表达式中含有相同优先级的运算符,则从左向右依次处理。还可以使用括号来提高运算的优先级,在括号中的表达式优先级最高。如果表达式有嵌套的括号,那么首先对嵌套最内层的表达式求值。
流程控制语句
(1)BEGIN…END语句
BEGIN…END语句用于将多个Transact-SQL语句组合为一个逻辑块。当流程控制语句必须执行一个包含两条或两条以上的T-SQL语句的语句块时,使用BEGIN…END语句。语法如下:
BEGIN
{sql_statement…}
END
其中,sql_statement是指包含的Transact-SQL语句。
BEGIN和END语句必须成对使用,任何一条语句均不能单独使用。BEGIN语句后为Transact-SQL语句块。最后,END语句行指示语句块结束。
(2)IF语句
IF<条件表达式>
{命令行|程序块}
(3)IF…ELSE语句
IF选择结构可以带ElSE子句。IF…ELSE的语法:
IF<条件表达式>
{命令行1|程序块1}
[ELSE
{命令行2|程序块2}
如果逻辑判断表达式返回的结果是“真”,那么程序接下来会执行命令行1或程序块1;如果逻辑判断表达式返回的结果是“假”,那么程序接下来会执行命令行2或程序块2。无论哪种情况,最后都要执行IF…ELSE语句的下一条语句。
(4)CASE语句
CASE input_expression
WHEN when_expression THEN result_expression
[ …n ]
[
ELSE else_result_expression
END
(5)WHILE循环语句
WHILE子句是T-SQL语句支持的循环结构。在条件为真的情况下,WHILE子句可以循环地执行其后的一条T-SQL命令。如果想循环执行一组命令,则需要使用BEGIN…END子句。
WHILE<条件表达式>
BEGIN
<命令行|程序块>
END
(6)WHILE…CONTINUE…BREAK语句
循环结构WHILE子句还可以用CONTINUE和BREAK命令控制WHILE循环中语句的执行。
语法:
WHILE<条件表达式>
BEGIN
<命令行|程序块>
[BREAK][CONTINUE]
[命令行|程序块]
END
其中,CONTINUTE命令可以让程序跳过CONTINUE命令之后的语句,回到WHILE循环的第一行命令。BREAK命令则让程序完全跳出循环,结束WHILE命令的执行。
(7)RETURN退出语句
RETURN语句用于从查询过程中无条件退出。RETURN语句可在任何时候用于从过程、批处理或语句块中退出。位于RETURN之后的语句不会被执行。
语法:
RETURN[整数值]
在括号内可指定一个返回值。如果没有指定返回值,SQL Server系统会根据程序执行的结果返回一个内定值。
(8)GOTO跳转语句
GOTO命令用来改变程序执行的流程,使程序跳到标识符指定的程序行再继续往下执行。
语法:
GOTO 标识符
标识符需要在其名称后加上一个冒号“:”。
例如:“66:”,“loving:”。
(9)WAITFOR挂起
WAITFOR指定触发器、存储过程或事务执行的时间、时间间隔或事件;还可以用来暂时停止程序的执行,直到所设定的等待时间已过才继续往下执行。
语法:
WAITFOR{DELAY<’时间’>|TIME<’时间’>
其中“时间”必须为DATETIME类型的数据,如“12:23:47”,但不能包括日期。各关键字含义如下:
DELAY:用来设定等待的时间,最多可达24小时。
TIME:用来设定等待结束的时间点。
DECLARE @X1 INT,@Y1 INT,@T INT
SET @X1=2
SET @Y1=3
SET @T=10
BEGIN
SET @T=@X1
SET @X1=@Y1
SET @Y1=@T
END
PRINT @X1
PRINT @Y1
PRINT @T
--BEGIN... END相当于{} 通常用在if
declare @x2 int
set @x2=8 --给变量x赋值8
if @x2 % 2=0 --判断是否是偶数
print '@x偶数'
print 'end'
declare @x3 int,@y3 int
set @x3=8
set @y3=-3
if @x3>0
if @y3>0
print'@x@y位于第一象限'
else
print'@x@y位于第四象限'
else
if @y3>0
if @y3<0
print'@x@y位于第二象限'
else
print'@x@y位于第三象限'
--case语句 第一种方式
use[DB-date03]
select kind = --kind字段下存放case的返回值
case --比较AGE字段
when AGE<0 then 1
when AGE>0 AND AGE<25 then 2
else '0'
end ,
cast(NAME as varchar(10)) as NAME01, --将NAME字段转换为5字节类型
SEX as sex --取别名PRICE
from tb_table
where AGE is not null --约束为AGE不空
order by NAME --根据NAME排序
--case语句 第二种方式
select names=
case NAME
when '小李' then '李四'
when '小红' then '红太狼'
end,
NAME as username
from tb_table
--求1~20之间的和。
declare @n int,@sum int --定义两个整型变量
set @n=1 --赋值1
set @sum=0 --赋值0
while @n<=20 --@n<=20成立的时候执行
begin
set @sum=@sum+@n --累加@n,赋给@sun
set @n=@n+1 --@n自加1
end
print @sum
DECLARE @N1 INT,@SUM1 INT
SET @N1=1
SET @SUM1=0
WHILE @N1<=20
BEGIN
SET @SUM1=@SUM1+@N1
SET @N1=@N1+1
END
PRINT @SUM1
PRINT @N1
--求1~20之间的偶数的和,并用CONTINUE控制语句的输出。
declare @x4 int,@sum2 int
set @x4=1
set @sum2=0
while @x4<20
begin
set @x4=@x4+1
if @x4%2=0
set @sum2=@sum2+@x4
else
continue
print '只有@x是偶数才输出这句话'
end
print @sum2
DECLARE @X5 INT
set @x5=3
if @x5>0
print'遇到return之前'
return
print'遇到return之后'
DECLARE @X7 INT --定义一个局部变量@x
SELECT @X7=1 --给@x赋值1
loving:
PRINT @X7
SELECT @X7=@X7+1
WHERE @X7<=3 GOTO loving
WAITFOR TIME'19:04:00'
PRINT'喜爱的歌曲:有时候'