【数据库原理与应用】Part03——T-SQL语言
- 一、SQL语言基本概念
- 1.1 T-SQL语言简介
- T-SQL语言的特点:
- 核心SQL语言的4个部分:
- 1.2 T-SQL语言的语法约定
- 1.3 标识符
- 常规标识符
- 分隔标识符
- 1.4 常量和变量
- 数据类型
- 常量
- 变量
- 1.5 注释
- 1.6 运算符
- 1.7 函数
- 1.7.1 标量函数
- 1.7.2 聚合函数
- 1.7.3 用户自定义函数
- 1.8 表达式
- 二、流程控制语句
- 2.1 SET 语句
- 2.2 BEGIN...END 语句
- 2.3 IF...ELSE 语句
- 2.4 WHILE、BREAK、CONTINUE 语句
- 2.5 RETURN 语句
- 2.6 WAITFOR 语句
- 2.7 GOTO 语句
- 2.8 TRY...CATCH语句
- 2.9 GO 语句
- 2.10 T-SOL 语句的解析、编译和执行
- 三、数据定义语句
一、SQL语言基本概念
SQL(Structured Query Language)即结构化查询语言,是关系数据库的标准语言,是一个通用的、功能极强的关系数据库语言。
目前,绝大多数流行的关系型数据库管理系统,如SQL Server、Oracle、Sybase等都采用了SQL语言标准。T-SQL(Transact-SQL)语言是Microsoft公司在SQL Server数据库管理系统中SQL的实现。
- SQL语言是非过程化语言。
- SQL语言是统一的语言。
- SQL语言是关系数据库的公共语言
1.1 T-SQL语言简介
T-SQL语言的特点:
高度非过程化
T-SQL是一个非过程化的语言。所有的T-SQL语句接受集合作为输入,返回集合作为输出。T-SQL的集合特性允许一条T-SQL语句的结果作为另一条T-SQL语句的输入。
综合统一
T-SQL可用于所有用户的数据库活动模型,包括系统管理员、数据库管理员、应用程序员、决策支持系统人员及许多其他类型的终端用户。
可移植性
虽然T-SQL语言是Microsoft公司在SQL Server数据库管理系统中SQL的实现,但T-SQL语言主要部分其它关系数据库管理系统都支持,只不过是有些细节不同而已。所以用户可将使用T-SQL的技能从SQL Server转到其它关系数据库管理系统中。
以同一种语法结构提供两种使用方式
T-SQL语言既是自含式语言,又是嵌入式语言。 作为自含式语言,它能够独立地使用;作为嵌入式语言,T-SQL语句可以嵌入到其他高级语言(如C、C++、C#、VB等)程序中。而在两种不同的使用方式下,T-SQL语言的语法结构基本一致。
简单易学
基本的T-SQL命令非常简单,语言十分简捷,非常容易学会。
核心SQL语言的4个部分:
核心SQL语言有以下4各部分:
- 数据定义语言 DDL
- 数据操作语言 DML
- 数据控制语言 DCL
- 嵌入式SQL语言的使用规定
1.2 T-SQL语言的语法约定
T-SQL语言参考的语法格式使用的约定以及说明见表:
1.3 标识符
前面介绍的数据库名、表名、列名其实就是标识符。
按照标识符的使用方式,可以把这些标识符分为常规标识符和分隔标识符两种类型。
常规标识符
常规标识符是符合标识符的格式规则的对象名称。在T-SQL语句中使用常规标识符时,不用使用分隔符将其分隔开。
在SQL Server 中,T-SQL的常规标识符必须符合以下格式规则:
- 第一个字符必须是下列字符之一:
-
- Unicode标准3.2所定义的字母。Unicode中定义的字母包括拉丁字母
a~z
和A~Z
,以及来自其他语言的字母字符。
- Unicode标准3.2所定义的字母。Unicode中定义的字母包括拉丁字母
-
_
下划线符号、@
符号或#
符号。
- 后续字符可以包括:
-
- Unicode标准 3.2 所定义的字母。
-
- 基本拉丁字符或其他国家/地区字符中的十进制数字。
-
_
下划线符号、@
符号、$
符号或数字符号。
- 标识符不能是T-SQL保留字。
- 不允许嵌入空格或其他特殊字符。
- 不允许使用增补字符。
在SQL Server中,某些位于标识符开头位置的符号具有特殊意义:
以@
符号开头的常规标识符表示局部变量或参数,并且不能用做任何其他类型的对象的名称;
以#
符号开头的标识符表示临时表或过程。以##
符号开头的标识符表示全局临时对象。
分隔标识符
包含在双引号" "
或方括号[ ]
内的标识符被称为分隔标识符。
符合所有标识符格式规则的标识符既可以使用分隔符,也可以不使用分隔符。但是,不符合常规标识符格式规则的标识符必须使用分隔符。
使用双引号分隔的标识符称为引用标识符,使用方括号分隔的标识符称为括号标识符。
1.4 常量和变量
T-SQL语言最常用到的就是常量和变量,无论是常量还是变量,都有数据类型。
数据类型
在SQL Server 2012中,每个列(字段或属性)、局部变量、表达式和参数都具有一个相关的数据类型。数据类型是一种属性,用于指定对象可保存的数据的类型。
SQL Server提供了系统数据类型和用户定义数据类型。
系统数据类型:
系统数据类型就是由SQL Server系统提供的数据类型,见表:
其他数据类型也包括:用户自定义数据类型
整型数据的精确数据类型:
用户定义数据类型:
用户定义数据类型是用户根据自己的需求,定义的一种新的数据类型,但用户定义数据类型必须建立在系统数据类型之上。
在对象资源管理器
中,展开COLLEGE
数据库,右键单击可编程性
中类型
的用户定义数据类型
选项,选择新建用户定义数据类型
选项。如图所示:
单击确定
按钮即新建成功。展开用户定义数据类型
选项,可以看到新建的数据类型。如图所示,使用用户定义数据类型与使用系统数据类型方法相同:
常量
常量指在程序运行过程中值不变的量。
常量又称为文字值或标量值,表示一个特定数据值的符号。常量的使用格式取决于它所表示的值的数据类型。
根据常量值的不同类型,分为 字符串常量、二进制常量、整型常量、实数常量、日期时间常量、货币常量、惟一标识常量。
字符串常量
字符串常量分为ASCII字符串常量和Unicode字符串常量。
ASCII字符串常量是用单引号引起来,并由ASCII字符构成的符号串常量。空字符串(‘’)用中间没有任何字符的两个单引号表示。例如:
'Windows'
\quad
'How are you!'
\quad
'SQL Server'
\quad
''
Unicode字符串常量的格式与普通字符串相似,但它前面有一个N标识符。N前缀必须是大写字母。例如:
N'Windows'
\quad
N'How are you!'
\quad
N'SQL Server'
\quad
N''
如果字符串包含一个嵌入的单引号,可以使用两个单引号表示嵌入的单引号。对于嵌入在双引号中的字符串则没有必要这样做。例如:
'He say:''Hi!'''
\quad
N'He say:''Hi!'''
二进制常量
二进制常量具有前辍0x,并且是十六进制数字字符串,不使用单引号。例如:
0x11F
\quad
0x95AE
\quad
0x1234ABC5678DEF
\quad
0x(空二进制常量)
bit常量
bit常量使用数字0或1表示,并且不括在引号中。如果使用一个大于1的数字,则该数字将转换为1。例如:
0
\quad
1
整型常量
整型常量以没有用引号引起来并且不包含小数点的十进制数字字符串来表示。整型常量必须全部为数字,不能包含小数。例如:
100
\quad
9
\quad
+126482139
\quad
-2136768
实数常量
实数常量是包含小数点的十进制数字字符串,分为定点表示和浮点表示。例如:
定点表示
15.46
\quad
5.0
\quad
+85698.1354
\quad
-583462.5429
浮点表示
316.4E3
\quad
0.12E-2
\quad
+562E+6
\quad
-4328E-3
日期和时间常量
日期和时间常量使用特定格式的字符日期值来表示,并被单引号引起来。SQL Server可以识别多种格式的日期和时间。例如:
- 数字日期格式
'2006-05-21'
\quad'2006/01/21'
\quad'12.05.2006'
\quad'05/10/26'
- 字母日期格式
'April 15,2006'
\quad'October 20,2006'
- 未分隔的字符串日期格式
'990710'
\quad'20061122'
- 时间格式
'10:40:34'
\quad'04:24 PM'
- 日期时间格式
'2006-05-21 10:40:34'
\quad'2006-04-05 08:07:02.520'
货币常量
货币常量以前缀为可选的小数点和可选的货币符号“$”的数字字符串来表示。例如:
$1329.46
\quad
-$5028
惟一标识常量
惟一标识(unique identifier)常量是表示全局惟一标识符(GUID)的字符串。可以使用字符或二进制字符串格式指定。例如:
'7A19DB-8B86-D011-B42D-00C04FC964FF'
\quad
0xdc19966f868b11d0b42d00c04fc964ff
变量
变量是指在程序运行过程中值可以改变的量,用于临时存放数据。变量具有名字及其数据类型两个属性,变量名用于标识该变量,数据类型用于确定该变量存放值的格式及允许的运算。
SQL Server的变量,按照数据库角度,可以分为数据库变量和普通变量。
普通变量又可以分为局部变量和全局变量。
-
变量名
变量名必须是一个合法的标识符。
SQL Server规定,变量名必须以ASCII字母、Unicode字母、汉字、下划线_
、@
或#
开头,后跟一个或多个ASCII字母、Unicode字母、汉字、下划线_
、@
、$
或#
,但不能都是下划线_
、@
、$
或#
。数据库名、表名、列名等,都是数据库变量。
如果是普通变量,变量名必须以@
开头,而且长度不能超过128个字符。例如:
COLLEGE
Mark
@StudentID
@name
@i_123
@@a
@var_#$
-
数据类型
变量的数据类型和常量数据类型的分类一样。SQL Server规定,普通变量必须先声明再使用。
在SQL Server中,使用DECLARE
语句声明变量,同时声明该变量的数据类型,使用SET
或SELECT
语句给变量赋值。声明一个变量后,该变量将被初始化为NULL
。
使用SET
或SELECT
语句将一个不是NULL
的值赋给声明的变量。给变量赋值的SET
语句返回单值,给变量赋值的SELECT
语句可以返回多值。
在初始化多个变量时,为每个局部变量使用单独的SET
语句。
在分配变量时,建议使用SET
语句。变量只能用在表达式中,不能代替对象名或关键字。
声明变量数据类型并赋值:
DECLARE @m int /* 声明变量@m为int>型 */ DECLARE @name nchar(10) /* 声明变量@name为nchar型 */ SET @m=5 /* 给变量@m赋整型数值 >*/ SET @name='张子鹏' /* 给变量@name赋>字符型数值'张子鹏' */ GO
示例:声明一个字符串变量,并在赋值后输出该变量的>值。
DECLARE @my_var char(20) SET @my_var = 'This is a test’ PRINT @my_var GO
- 全局变量和局部变量
局部变量的作用范围仅限制在程序的内部,即在其中定义局部变量的批处理、存储过程或语句块。局部变量常用来保存临时数据。普通变量通常都是局部变量。
全局变量由SQL Server系统内部提供,其作用范围并不仅仅局限于某一个程序,以系统函数形式使用。
用户不能定义全局变量,只能使用系统提供的预先定义的全局变量,任何程序均可以随时饮用全局变量。
全局变量名前必须加两个“@”符号。例如:
@@version
@@spid
注意,局部变量名不能与全局变量名重名。
1.5 注释
所有的程序设计语言都有注释。注释是程序代码中不执行的文本字符串,用于对代码的说明。
SQL Server提供了两种注释字符:--
(双连字符)和 /* */
。
--
为单行注释,对于多行注释语句,需要每行都使用。/* */
可以在程序的任意处注释,只要包含在 /*
和 */
之间的都是注释。
1.6 运算符
运算符是一种符号,用来指定要在一个或多个表达式中执行的操作。SQL Server所使用的运算符类别见如下表:
1.7 函数
函数是一个T-SQL语句的集合,每个函数用于完成某种特定的功能。SQL Server将函数分为内置系统函数和用户定义函数。
内置函数又称为系统函数,由SQL Server系统提供。其实这些函数都在创建的数据库中已经存在。用户可以展开数据库的 可编程性
的 函数
对象查看。如图所示:
SQL Server内置函数分为 4 类:标量函数,聚合函数,排名函数和行集函数。
1.7.1 标量函数
标量函数对单一值进行运算,然后返回单一值。只要表达式有效,即可使用标量函数。标量函数使用范围广、频率高,所以又细分为 12 种类型。见如下表:
数学函数
常用的数学函数见表:
字符串函数
常用的字符串函数见表:
LEN()
函数
语法格式为:LEN(String_expression)
返回字符串表达式string_expression
的长度。
注意:
LEN()
函数所返回的数值是字符数而不是字节数,而且它会先除去字符串表达式的尾随空格再返回其字符教。如果字符串表达式是一个空字符串,LEN()
函数将返回数值零。
DATALENGTH()
函数
DATALENGTH()
函数的语法格式为: DATALENGTH(String_expression)
LEN()
函数返回某个字符串表达式的长度。
DATALENGTH()
函数则返回任何一种数据类型的表达式的字节数。
示例语句:
SELECT DATALENGTH('我叫John'); SELECT DATALENGTH('我叫John '); SELECT DATALENGTH(''); DECLARE @vlString1 nvarchar(10); DECLARE @vlString2 nvarchar(16); SET @vlString1=N'我是伍为平'; SET @vlString2=N'My name is Alex '; SELECT DATALENGTH(@vlString1); SELECT DATALENGTH(@vlString2);
结果:
SUBSTRING()
函数
SUBSTRING()
函数的语法格式为: SUBSTRING(expression,start,length)
SUBSTRING()
函数能够从expression
参数所指定的表达式中,从start
参数指定的位置开始,取出length
参数所指定个数的字符并返回。
SELECT SUBSTRING(‘Microsoft SQL Server’,11,3);
输出结果将返回字符串‘SQL’
。显然,start
和length
参数都是整数。
但是其单位则可能是字符数或字节数。
LEFT()函数
函数的语法格式为: LEFT(character_expression,integer_expression)
LEFT()
函数会从字符串表达式character_expression
最左边的字符开始算起,返回integer_expression
参数所指定个数的字符。
integer_expression
代表字符数而不是字节数,而且即使character_expression
内含中文文字,中文文字也视为占用1个字符位置而不是2个字符位置。
字符串表达式character_expression
必须是char
、nchar
、varchar
、nvarchar
、binary
或varbinary
数据类型。
RIGHT()函数
函数的语法格式为:
RIGHT(character_expression,integer_expression)
RIGHT()
函数从字符串表达式character_expression
最右边的字符开始算起,返回integer_expression
参数所指定个数的字符。
STUFF()函数
该函数可用于修改给定字符串中的一部分,其语法格式为:
STUFF(character_expression,start,length,replace_expression)
SELECT STUFF('计算机图书大世界',4,5,'教育‘)
上述SQL语句执行结果是返回字符串:
‘计算机教育’
LOWER()函数
LOWER()
函数语法格式如下:
LOWER(character_expression)
使用LOWER()函数可将字符串表达式character_expression
中的所有大写字母转换成小写字母,然而LOWER()
函数并不会影响非英文字母的字符(包括中文在内)。
SELECT LOWER(‘我的计算机名称是:JOHN’);
上述代码执行结果后返回:
’我的计算机名称是:john’
UPPER()函数
UPPER()
函数语法格式为:
UPPER(character_expression)
该函数可将字符串表达式character_expression
中所有的小写字母转换成大写字母。但它不会影响非英文字母的字符(包括中文在内)。
SELECT UPPER(‘我的计算机名称是:john’);
上述代码执行结果后返回:
‘我的计算机名称是:JOHN’
日期和时间数据类型函数
常用的日期和时间函数见如下表:
上表中所示的日期和时间函数的“日期部分”参数,可以使用下表所示的“日期部分”列中的值,也可以使用相应的缩写来代替。
该类函数用于进行日期和时间运算,其返回值可以是字符串、日期、时间、数值等:
DATEADD(datepart, increment, date)
函数
该函数返回在指定日期上加一个时间间隔后的新日期值。
示例:日期计算:
SELCT DATEADD(month, 3, ‘9-5-2005’)
执行代码,其结果是:
2005-12-05 00:00:00.000
日期一定要写成字符串形式,时间常量一定要用单引呈括起来。
DATEDIFF(datepart, date1, date2)
函数
该函数返回开始日期date1
和结束日期date2
的差值。
DATENAME(datepart, date)
函数
该函数返回日期值的名称。
YEAR()
、MONTH()
、DAY()
函数
上述函数分别返回一个代表指定日期相应部分的数值,其参数都是一个日期常量或表达式。
GETDATE()
函数
GETDATE()
函数不具有任何参数,能够以Microsoft SQL Server
标准的日期时间格式返回系统当前的日期与时间。
GETUTCDATE()
函数
该函数返回代表当前UTC
时间(Universal Time Coordinate
或GreenwichMeanTime
)的日期时间值。
DATEPART(datepart, date)
函数
该函数返回日期的部分值。
该函数是一个非常有弹性的函数,因为它可以通过设置datepart
参数来返回日期时间表达式date
的年份、月份、日数、小时、分钟、秒等特定日期时间信息。
DATEPART()
函数以int
数据类型返回整数值。
示例:
DECLARE @Now datetime; SET @Now =GETDATE(); SELECT '今天是公元'+CAST(DATEPART(yy,@Now) AS char(4))+'年'+ RTRIM(CAST(DATEPART(mm,@Now) AS char(2)))+'月'+ RTRIM(CAST(DATEPART(dd,@Now) AS char(2)))+'日'+ RTRIM(CAST(DATEPART(hh,@Now) AS char(2)))+'点'+ RTRIM(CAST(DATEPART(mi,@Now) AS char(2)))+'分'+ RTRIM(CAST(DATEPART(ss,@Now) AS char(2)))+'秒星期'+ RTRIM(CAST((DATEPART(dw,@Now)-1) As char(2)));
在输出窗口显示的执行结果如下:
逻辑函数
常用的逻辑函数见如下表:
转换函数
常用的转换函数见如下表:
一般情况下,SQL Server会自动处理某些数据类型的转换。例如将smallint类型转换为int类型。这种转换称为隐性转换。
但有些数据类型无法由SQL Server自动转换,就必须使用转换函数做显示转换。CAST
和CONVERT
函数是数据类型转换函数,功能相同,只是函数语法格式不同。
CAST
函数语法格式如下:
CAST(表达式 AS 数据类型)
CONVERT
函数语法格式如下:
CONVERT(数据类型,表达式 [,样式])
例:使用CAST
和CONVERT
函数进行数据类型转换。
SELECT CONVERT(NCHAR,'10-30-2013',101), CAST(25 AS NCHAR)
输出结果:
输出结果是将字符串“10-30-2013”按照101标准(美国标准)转换为日期时间类型,将整数25转换为字符串类型。
元函数
常用的元函数见如下表:
安全函数
常用的安全函数见如下表:
配置函数
常用的配置函数见如下表:
系统函数
常用的系统函数见如下表:
系统统计函数
常用的系统统计函数见如下表:
游标函数
常用的游标函数见如下表:
1.7.2 聚合函数
聚合函数与数学函数、字符换函数、日期和时间函数不太一样,通常都是在表查询时使用,也就是函数的参数都是表的列名,单独使用没有意义。聚合函数对一组值进行运算,但只返回一个汇总值。由于聚合函数通常用在对表的查询操作中,一些聚合函数的示例不方便举例,所以只举几个示例。
常用的聚合函数见如下表:
AVG()
函数
AVG()
函数返回有关指定参数的算术平均值,因此该函数只适用于数值型的参数。
其语法格式如下:
AVG([ALL|DISTINCT]expression)
示例:
USE AdventureWorks; GO SELECT AVG(DISTINCT ListPrice) AS 平均标价 FROM Production.Product;
COUNT()
函数
该函数返回与表达式匹配的列中不为NULL值的数据个数。其语法格式为:
COUNT({[[ALL|DISTINCT]expression]|*})
COUNT(*)
函数计算所有行以返回表中行的总数。该函数表达式不需要任何参数,且不能与DISTINCT
一起使用。
MAX()
函数
MAX
函数返回表达式中最大值,MAX
忽略任何空值。该函数可用于数据型、字符型和日期型的表达式。其语法格式为:
MAX([ALL|DISTINCT]expression)
MIN()
函数
MIN
函数返回表达式中最小值,函数语法格式如下:
MIN([ALL|DISTINCT]expression)
SUM()
函数
该函数返回表达式中除NULL取值外的所有值的和。其语法格式为:
SUM([ALL|DISTINCT]expression)
示例:
USE TEACHING_MIS; GO SELECT SUM(RESULT)as '一班总成绩' FROM dbo.RESULTS WHERE SUBSTRING(SID,5,4)='0101'; GO
1.7.3 用户自定义函数
SQL Server不仅提供了大量的系统内置函数,而且允许用户根据需要创建自定义函数。用户选择数据库中“可编程性”中的“函数”对象,选择右键菜单的“新建”选项,可以创建用户定义函数,如下图所示:
用户定义函数是一个已保存T-SQL或公共语言运行时CLR
例程,该例程可返回一个值。用户定义函数为标量值函数或表值函数。如果RETURNS
子句指定了一种标量数据类型,则函数为标量值函数。可以使用多条T-SQL语句定义标量值函数。如果RETURNS
子句指定TABLE
,则函数为表值函数。根据函数主体的定义方式,表值函数可分为内联函数或多语句函数。用户定义函数使用T-SQL语句CREATE FUNCTION
新建,使用ALTER FUNCTION
修改,使用DROP FUNCTION
删除。
确定性函数和非确定性函数
SQL Server根据函数返回结果又分为确定性函数和非确定性函数。
所谓确定性函数是指,只要使用特定的输入值集并且数据库具有相同的状态,那么不管何时调用,确定性函数始终都会返回相同的结果。那么这种函数就是确定性函数。
所谓非确定性函数是指,即使访问的数据库的状态不变,每次使用特定的输入值集调用非确定性函数都可能会返回不同的结果。那么这种函数就是非确定性函数。
SQL Server中,所有的配置函数、游标函数、元数据函数、安全函数、系统统计函数等都是非确定性函数。用户无法影响任何内置函数的确定性。
所有聚合和字符串,以及大部分的数学函数等内置函数都是确定性函数。
所有配置、游标、元数据、安全和系统统计等函数都是非确定性函数。
例如,ABS
绝对值函数是确定性函数,CGETDATE
函数是非确定性函数。
1.8 表达式
通过运算符可以将变量、常量、函数等连接在一起构成表达式。
在SQL Server中,用户通过在查询窗口输入运行T-SQL语句代码,实现表达式。
1. 赋值表达式
T-SQL提供了惟一的赋值运算符=
。用户可以使用赋值运算符给变量等赋值,也可以在列标题和定义列值的表达式之间建立关系。
例:声明变量数据类型并赋值。
DECLARE @m INT DECLARE @n NCHAR(10) SET @m=600 SELECT @n='Windows' GO
2. 算术运算表达式
算术运算符对两个表达式执行数学运算,这两个表达式可以是数值数据类型类别的一个或多个数据类型,也可以是日期时间型。
例:声明变量数据为整型类型并赋值,进行算术运算。
DECLARE @x INT DECLARE @y INT DECLARE @z DATETIME SET @x=4 SET @y=SQRT((3*@x+20)/2) SET @z=GETDATE()+@y SELECT @y,@z GO
输出结果:
3. 按位运算表达式
按位运算符在两个表达式之间执行位(二进制位)运算。位运算符的操作数可以是整数或二进制字符串数据类型类别中的任何数据类型(image
数据类型除外),但两个操作数不能同时是二进制字符串数据类型类别中的某种数据类型。
例:声明变量为整型类型并赋值,进行位运算。
DECLARE @i INT DECLARE @j INT SET @i=231 SET @j=54 SELECT @i&@j,@i|@j,@i^@j GO
运行结果如下图所示:
输出结果是将十进制的数,按照二进制的位运算得出,再以十进制的方式显示。
4. 字符串串联运算表达式
字符串串联运算符将两个字符串数据相连接,生成一个新的字符串。
例:声明变量为字符串类型并赋值,进行字符串串联运算。
DECLARE @var1 NCHAR(10) DECLARE @var2 NCHAR (2) SET @var1='北京' SET @var2='欢迎你' SELECT RTRIM(@var1)+@var2 GO
运行结果如下图所示:
字符串连接结果少了个你
字,原因是在声明字符串变量@var2
时,该变量只有2个字符的存储空间。
5. 比较运算表达式
比较运算符又称为关系运算符,用来测试两个表达式是否相同。SQL Server所使用的比较运算符运算规则,见下表:
除了text
、ntext
或image
数据类型的表达式外,比较运算符可以用于所有的表达式,结果是boolean
数据类型。它有3个值:TRUE
、FALSE
和UNKNOWN
。返回boolean
数据类型的表达式称为布尔表达式。与其他SQL Server数据类型不同,boolean
数据类型不能被指定为表列或变量的数据类型,也不能在结果集中返回。
可以使用SET ANSI_NULLS
设置比较运算结果显示。当SET ANSI_NULLS
为ON
时,带有一个或两个NULL
表达式的运算符返回UNKNOWN
。当SET ANSI_NULLS
为OFF
时,上述规则同样适用,但是两个表达式均为NULL
,则等号=
运算符返回TRUE
。
例:声明变量为整型类型并赋值,进行比较运算。
SET ANSI_NULLS ON IF 5<6 /* 不显示比较结果,只根据结果选择执行语句 */ --如果“5<6”比较结果为TRUE,执行SELECT语句 SELECT 'OK' GO
6. 逻辑运算表达式符
逻辑运算符对某些条件进行测试。逻辑运算符和比较运算符一样,返回带有TRUE
或FALSE
值的boolean
数据类型。SQL Server所使用的逻辑运算符运算规则,见如下表:
其中,ALL
、ANY
、BETWEEN
、EXISTS
、LIKE
、SOME
通常用于数据库查询。
例:声明变量为整型类型并赋值,进行比较运算。
DECLARE @x INT DECLARE @y INT DECLARE @z INT SET @x=5 SET @y=10 SET @z=15 IF (@x>10) OR (@y<=10) AND (@z=15) SELECT '逻辑表达式结果为TRUE' GO
7. 一元运算表达式
+
(正)和-
(负)运算符可以用于numeric
数据类型类别中任意数据类型的任意表达式。~
(按位取非)运算符只能用于整数数据类型类别中任意数据类型的表达式。
例:声明变量为整型类型并赋值,进行一元运算。
DECLARE @m int SET @m=23 SELECT ~@m GO
8. 运算符优先级
当一个复杂的表达式有多个运算符时,运算符优先级决定运算符的先后顺序。SQL Server所使用的运算符的优先级,见如下表:
二、流程控制语句
与所有的计算机编程语言一样,T-SQL语言也提供了用于编程的代码的语法结构,可用来进行顺序、选择、循环等程序设计。在SQL Server中提供了一些流程控制语句,也称为控制流语言,见如下表:
2.1 SET 语句
SET
语句将先前使用DECLARE @local_variable
语句创建的局部变量设置为指定值。声明一个变量后,该变量将被初始化为NULL
。使用SET
语句将一个不是NULL
的值赋给声明的变量。其语法格式为:
SET @local_variable= expression
说明:SET
语句是顺序执行的,将一个表达式赋给声明的变量。表达式的数据类型一定要和变量声明的数据类型相符。
例:声明变量数据类型,并用SET语句顺序给变量赋值。
DECLARE @int_a INT DECLARE @char_ch NCHAR(10) SET @int_a=15 SET @char_ch='hello world' GO
除了赋值外,T-SQL编程语言还提供了一些SET语句,这些语句可以设置特定信息的当前处理方式。
2.2 BEGIN…END 语句
在实际的程序设计过程中,IF…ELSE
语句中不止包含一条语句,而是一组SQL
语句。为了可以一次执行一组SQL
语句,这时就需要使用BEGIN…END
语句将多条语句封闭起来。其语法格式为:
BEGIN
{sql_statement | statement_block } /* 语句块 */
END
BEGIN…END
语句块允许嵌套。
2.3 IF…ELSE 语句
IF…ELSE
语句对条件表达式进行判断,如果满足条件,则在IF
及其条件之后执行SQL
语句,此时条件表达式返回TRUE
;可选的ELSE
引入另一个SQL
语句,当不满足IF
条件时,就执行该语句,此时条件表达式返回FALSE
。其语法格式为:
IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE
{ sql_statement | statement_block } ]
例:声明变量数据类型并赋值,用IF…ELSE语句进行选择。
DECLARE @dec_x DECIMAL(6,1) SET @dec_x=20.1 IF @dec_x>20 /* 判断数值大> 小*/ BEGIN SELECT '@dec_x大于20' /* 条件 为真执行*/ END ELSE SELECT '@dec_x小于20' /* 条件为假执行*/ GO
例:根据分数划分等级:小于60分是差,大于等于60分但小于80分是良,大于等于80分是优。用
IF…ELSE
语句选择。DECLARE @score INT SET @score =50 IF @score >=60 IF @score <80 SELECT '良' ELSE SELECT '优' ELSE SELECT '差' GO
运行结果如下图所示:
当IF…ELSE
语句嵌套时,一定要注意IF
和ELSE
的配对。而且T-SQL语言没有限定IF…ELSE
语句嵌套的层数,但一般嵌套不要超过3
层,否则将降低程序的可读性。
2.4 WHILE、BREAK、CONTINUE 语句
WHILE
语句设置重复执行SQL
语句或语句块的条件。只要指定的条件为TRUE
,就重复执行语句。可以使用BREAK
和CONTINUE
关键字在循环内部控制WHILE
循环中语句的执行。BREAK
将导致无条件退出WHILE
循环,执行END
(循环结束标记)后面的任何语句。CONTINUE
使WHILE
循环重新开始执行,忽略CONTINUE
后面的任何语句。其语法格式为:
WHILE Boolean_expression /* 循环条件 */
{ sql_statement|statement_block} /* 循环体语句 */
[ BREAK ] /* 无条件退出循环 */
{ sql_statement | statement_block } /*循环体语句*/
[ CONTINUE ] /*重新开始循环*/
{ sql_statement | statement_block } /*循环体语句*/
例:声明变量数据类型并赋值,用WHILE
语句进行判断,当符合条件时,则重新循环或退出循环。
DECLARE @i int
SET @i=1
WHILE @i<=20 /* 循环条件 */
BEGIN
SET @i=@i+1
IF @i=10
BREAK /* 无条件退出循环 */
ELSE
CONTINUE /* 重新循环 */
END
SELECT @i /* 输出结果 */
GO
WHILE
语句允许嵌套。如果WHILE
语句嵌套,则先执行最里面的循环,最后执行最外边的循环。如果在内层循环中使用了BREAK
语句,将无条件退出本层循环。
2.5 RETURN 语句
RETURN
语句从查询或过程中无条件退出。RETURN
的执行是即时且完全的,可在任何时候用于从过程、批处理或语句块中退出。RETURN
之后的语句是不执行的。如果用于存储过程,RETURN
不能返回空值。其语法格式为:
RETURN [ integer_expression ] /* 返回一个整型表达式 */
RETURN
语句通常在存储过程中使用,本文暂不举例。
2.6 WAITFOR 语句
WAITFOR
语句称为延迟语句,设定在达到指定时间或时间间隔之前,或者指定语句至少修改或返回一行之前,阻止执行批处理、存储过程或事务。其语法格式为:
WAITFOR
{ DELAY 'time_to_pass' /* 设定等待时间 */
| TIME 'time_to_execute' /* 设定等待带某一时刻 */
}
例:用WAITFOR语句设置延迟操作。
WAITFOR DELAY '0:0:10' /* 等待10s */ WAITFOR TIME '10:00' /* 等到10点 */ GO
WAITFOR
语句通常用在存储过程或触发器中,用来设定时间开关。
2.7 GOTO 语句
GOTO
语句将执行语句无条件跳转到标签处,并从标签位置继续处理。GOTO
语句和标签可在过程、批处理或语句块中的任何位置使用。其语法格式为:
GOTO label
GOTO
语句可嵌套使用。GOTO
可出现在条件控制流语句、语句块或过程中,但它不能跳转到该批语句以外的标签。GOTO
分支可跳转到定义在GOTO
之前或之后的标签。
例:用GOTO语句设置无条件跳转。
DECLARE @n1 INT,@n2 INT SET @n1=10 SET @n2=20 GOTO label1 IF @n1>@n2 SELECT 'n1大于n2' label1: IF @n1<@n2 SELECT 'n2大于n1' ELSE SELECT 'n2小于n1' GO
使用GOTO
语句时,必须在程序中设置地址标签。
2.8 TRY…CATCH语句
SQL
提供TRY…CATCH
语句用以实现类似于C#
和C++
语言中的异常处理的错误处理。如果TRY
块内部发生错误,则会将控制传递给CATCH
块中包含的另一个语句组。其语法格式为:
BEGIN TRY
{sql_statement | statement_block }
END TRY
BEGIN CATCH
{ sql_statement | statement_block }
END CATCH
TRY…CATCH
语句捕捉所有严重级别大于10
但不终止数据库连接的错误。 TRY
语句后必须紧跟相关联的CATCH
语句。
在END TRY
和BEGIN CATCH
语句之间放置任何其他语句都将生成语法错误。
TRY…CATCH
不能跨越多个批处理。
TRY…CATCH
通常使用以下系统函数来获取CATCH块执行的错误信息:
ERROR_NUMBER()
:返回错误号。ERROR_MESSAGE()
:返回错误消息的完整文本。ERROR_SEVERITY()
:返回错误的严重性。ERROR_STATE()
:返回错误状态号。ERROR_LINE()
:返回导致错误的例程中的行号。
例:用
TRY…CATCH
语句,返回错误信息。BEGIN TRY PRINT 5/0 END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS N'ERRORNUMBER', ERROR_MESSAGE() AS N'ERRORMESSAGE', ERROR_SEVERITY() AS N'ERRORSEVERITY', ERROR_STATE() AS N'ERRORSTATE', ERROR_LINE() AS N'ERRORLINE' END CATCH GO
2.9 GO 语句
GO
语句是一个程序段落结束标识,通常用在一段程序的结尾处,标识此段程序结束。不参与程序运行。
EXECUTE
语句是执行T-SQL
批中的命令字符串、字符串或执行下列模块之一:系统存储过程、用户定义存储过程、标量值用户定义函数或扩展存储过程。EXECUTE
语句可以使用缩写形式EXEC
。
2.10 T-SOL 语句的解析、编译和执行
在查询窗口中执行T-SQL语句可以分为3个阶段,即解析、编译和执行。
在解析阶段,数据库引擎对输入的T-SQL语句中的每个字符进行扫描和分析,判断其是否符合语法约定。
三、数据定义语句
T-SQL语言的主要功能并不是用于编写流程控制语句,而是用于SQL Server关系数据库操作的语言,其完成核心功能只用了9个语句,见如下表: