内容大纲:
T-SQL语言的组成
T-SQL语言是具有强大查询功能的数据库语言,除此以外,T-SQL还可以控制DBMS为其用户提供的所有功能,主要包括如下:
数据定义语言(DDL,Data Definition Language):SQL让用户定义存储数据的结构和组织,以及数据项之间的关系。
数据检索语言:SQL允许用户或应用程序从数据库中检索存储的数据并使用它。
数据操纵语言(DML,Data Manipulation Language):SQL允许用户或应用程序通过添加新数据、删除旧数据和修改以前存储的数据对数据库进行更新。
数据控制语言(DCL,Data Control Language):可以使用SQL来限制用户检索、添加和修改数据的能力,保护存储的数据不被未授权的用户所访问。
数据共享:可以使用SQL来协调多个并发用户共享数据,确保他们不会相互干扰。
数据完整性:SQL在数据库中定义完整性约束条件,使它不会由不一致的更新或系统失败而遭到破坏
因此,T-SQL是一种综合性语言,用来控制并与数据库管理系统进行交互作用。T-SQL是数据库子语言,包含大约40条专用于数据库管理任务的语句。
数据操作类SQL语句。
数据定义类SQL语句。
数据控制类SQL语句。
事务控制类SQL语句。
程序化SQL语句。
T-SQL语句结构
每条SQL语句均由一个谓词(Verb)开始,该谓词描述这条语句要产生的动作,例如SELECT或UPDATE关键字。谓词后紧接着一个或多个子句(Clause),子句中给出了被谓词作用的数据或提供谓词动作的详细信息。每一条子句都由一个关键字开始。下面以SELECT语句为例介绍T-SQL语句的结构,语法格式如下:
SELECT 子句
[INTO 子句]
FROM 子句
[WHERE 子句]
[GROUP BY 子句]
[HAVING 子句]
[ORDER BY 子句]
T-SQL中的变量与常量–字符串常量
字符串常量定义在单引号内。字符串常量包含字母、数字字符(az、AZ和0~9)及特殊字符(如数字号#、感叹号!、at符@)。
T-SQL中的变量与常量—二进制常量
在Transact—SQL中定义二进制常量,需要使用0x,并采用十六进制来表示,不再需要括号。
例如,以下为二进制常量:
0xB0A1
0xB0C4
0xB0C5
T-SQL中的变量与常量–BIT常量
在Transact—SQL中,bit常量使用数字0或1即可,并且不包括在引号中。如果使用一个大于1的数字,则该数字将转换为1。
T-SQL中的变量与常量—日期和时间常量
定义日期和时间常量需要使用特定格式的字符日期值,并使用单引号。
例如,以下为日期和时间常量:
‘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类型外所有的系统数据类型和用户自定义数据类型。一般来说,如果没有特殊的用途,建议在应用时尽量使用系统提供的数据类型。这样做,可以减少维护应用程序的工作量。
例如:声明局部变量 @ songname,SQL语句如下:
declare @songname char(10)
2.为局部变量赋值
为变量赋值的方式一般有两种,一种是使用SELECT语句,一种是使用SET语句。使用SELECT语句为变量赋值的语法如下:
SELECT @varible_name = expression
[FROM table_name [ ,… n ]
WHERE clause ]
上面的SELECT语句的作用是为了给变量赋值,而不是为了从表中查询出数据。而且在使用SELECT语句进行赋值的过程中,并不一定非要使用FROM关键字和WHERE子句。
注意:
数据库语言和编程语言有一些关键字,关键字是在某一环境下能够促使某一操作发生的字符组。为避免冲突和产生错误,在命名表、列、变量以及其他对象时应避免使用关键字。
T-SQL中的变量与常量—全局变量
全局变量是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.字符串连接运算符
连接运算符“+”用于连接两个或两个以上的字符或二进制串、列名或者串和列的混合体,将一个串加入到另一个串的末尾。语法如下:
7.运算符优先级
当一个复杂表达式中包含有多个运算符时,运算符的优先级决定了表达式计算和比较操作的先后顺序。运算符的优先级由高到低的顺序如下:
(1)+(正)−(负)~(位反)
(2)*(乘)/(除)%(取余)
(3)+(加)+(字符串串联运算符)-(减)
(4)=、>、<、>=、<=、<>、!=、!>、!<(比较运算符)
(5)^(按位异或)&(按位与)| (按位或)
(6)NOT
(7)AND
(8)ALL ANY BETWEEN IN LIKE OR SOME(逻辑运算符)
(9)=(赋值)
若表达式中含有相同优先级的运算符,则从左向右依次处理。还可以使用括号来提高运算的优先级,在括号中的表达式优先级最高。如果表达式有嵌套的括号,那么首先对嵌套最内层的表达式求值。
流程控制语句–BEGIN…END语句
BEGIN…END语句用于将多个Transact-SQL语句组合为一个逻辑块。当流程控制语句必须执行一个包含两条或两条以上的T-SQL语句的语句块时,使用BEGIN…END语句。语法如下:
BEGIN
{sql_statement…}
END
其中,sql_statement是指包含的Transact-SQL语句。
BEGIN和END语句必须成对使用,任何一条语句均不能单独使用。BEGIN语句后为Transact-SQL语句块。最后,END语句行指示语句块结束。
流程控制语句—IF判断
在SQL Server中为了控制程序的执行方向,也会像其他语言(如C语言)有顺序、选择和循环3种控制语句,其中IF就属于选择判断结构。IF结构的语法如下:
IF<条件表达式>
{命令行|程序块}
其中<条件表达式>可以是各种表达式的组合,但表达式的值必须是逻辑值“真”或“假”。其中命令行和程序块可以是合法Transact-SQL任意语句,但含两条或两条以上的语句的程序块必须加BEGIN…END子句
执行顺序是:遇到选择结构IF子句,先判断IF子句后的条件表达式,如果条件表达式的逻辑值是“真”,就执行后面的命令行或程序块,然后再执行IF结构下一条语句;如果条件式的逻辑值是“假”,就不执行后面的命令行或程序块,直接执行IF结构的下一条语句。
流程控制语句—IF…ELSE选择
IF选择结构可以带ElSE子句。IF…ELSE的语法:
IF<条件表达式>
{命令行1|程序块1}
[ELSE
{命令行2|程序块2}
如果逻辑判断表达式返回的结果是“真”,那么程序接下来会执行命令行1或程序块1;如果逻辑判断表达式返回的结果是“假”,那么程序接下来会执行命令行2或程序块2。无论哪种情况,最后都要执行IF…ELSE语句的下一条语句。
流程控制语句—CASE语句
使用CASE语句可以很方便的实现多重选择的情况,比IF…THEN结构有更多的选择和判断的机会,可以避免编写多重的IF…THEN嵌套循环。
Transact-SQL支持CASE有两种语句格式。
简单CASE函数:
CASE input_expression
WHEN when_expression THEN result_expression
[ …n ]
[
ELSE else_result_expression
END
CASE搜索函数:
CASE
WHEN Boolean_expression THEN result_expression
[ …n ]
[
ELSE else_result_expression
END
参数说明:
input_expression:使用简单CASE格式时所计算的表达式。input_expression是任何有效的Microsoft® SQL Server™表达式。
WHEN when_expression:使用简单CASE格式时input_expression所比较的简单表达式。when_expression是任意有效的SQL Server表达式。input_expression和每个when_expression的数据类型必须相同,或者是隐性转换。
n:占位符,表明可以使用多个WHEN when_expression THEN result_expression子句或WHEN Boolean_expression THEN result_expression子句。
THEN result_expression:当input_expression = when_expression取值为TRUE,或者Boolean_expression取值为TRUE时返回的表达式。result_expression是任意有效的SQL Server表达式。
ELSE else_result_expression:当比较运算取值不为TRUE时返回的表达式。如果省略此参数并且比较运算取值不为TRUE,CASE将返回NULL值。else_result_expression是任意有效的SQL Server 表达式。else_result_expression和所有result_expression的数据类型必须相同,或者必须是隐性转换。
WHEN Boolean_expression:使用CASE搜索格式时所计算的布尔表达式。Boolean_expression是任意有效的布尔表达式。
下面介绍简单CASE函数和CASE搜索函数两种格式的执行顺序。
简单CASE函数:
(1)计算input_expression,然后按指定顺序对每个WHEN子句的input_expression = when_expression进行计算。
(2)返回第一个取值为TRUE的(input_expression = when_expression)的result_expression。
(3)如果没有取值为TRUE的input_expression = when_expression,则当指定ELSE子句时,SQL Server将返回else_result_expression;若没有指定ELSE子句,则返回NULL值。
流程控制语句—WHILE循环
WHILE子句是T-SQL语句支持的循环结构。在条件为真的情况下,WHILE子句可以循环地执行其后的一条T-SQL命令。如果想循环执行一组命令,则需要使用BEGIN…END子句。
WHILE<条件表达式>
BEGIN
<命令行|程序块>
END
遇到WHILE子句,先判断条件表达式的值,当条件表达式的值为“真”时,执行循环体中的命令行或程序块,遇到END子句会自动地再次判断条件表达式值的真假,决定是否执行循环体中的语句。只能当条件表达式的值为“假”时,才结束执行循环体的语句。
流程控制语句–WHILE…CONTINUE…BREAK
循环结构WHILE子句还可以用CONTINUE和BREAK命令控制WHILE循环中语句的执行。
语法:
WHILE<条件表达式>
BEGIN
<命令行|程序块>
[BREAK]
[CONTINUE]
[命令行|程序块]
END
其中,CONTINUTE命令可以让程序跳过CONTINUE命令之后的语句,回到WHILE循环的第一行命令。BREAK命令则让程序完全跳出循环,结束WHILE命令的执行。
流程控制语句-- RETURN退出
RETURN语句用于从查询过程中无条件退出。RETURN语句可在任何时候用于从过程、批处理或语句块中退出。位于RETURN之后的语句不会被执行。
语法:
RETURN[整数值]
在括号内可指定一个返回值。如果没有指定返回值,SQL Server系统会根据程序执行的结果返回一个内定值。
流程控制语句–GOTO跳转
GOTO命令用来改变程序执行的流程,使程序跳到标识符指定的程序行再继续往下执行。
语法:
GOTO 标识符
标识符需要在其名称后加上一个冒号“:”。
流程控制语句—WAITFOR挂起
WAITFOR指定触发器、存储过程或事务执行的时间、时间间隔或事件;还可以用来暂时停止程序的执行,直到所设定的等待时间已过才继续往下执行。
语法:
WAITFOR{DELAY<’时间’>|TIME<’时间’>
其中“时间”必须为DATETIME类型的数据,如“12:23:47”,但不能包括日期。各关键字含义如下:
DELAY:用来设定等待的时间,最多可达24小时。
TIME:用来设定等待结束的时间点。
例: