【数据库原理与SQL Server应用】Part03——T-SQL语言

一、SQL语言基本概念

SQLStructured Query Language即结构化查询语言关系数据库的标准语言是一个通用的、功能极强的关系数据库语言。

目前绝大多数流行的关系型数据库管理系统如SQL Server、Oracle、Sybase等都采用了SQL语言标准。T-SQLTransact-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~zA~Z以及来自其他语言的字母字符。
    • _ 下划线符号、@ 符号或 # 符号。
  • 后续字符可以包括
    • 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语句声明变量同时声明该变量的数据类型使用SETSELECT语句给变量赋值。声明一个变量后该变量将被初始化为NULL
    使用SETSELECT语句将一个不是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’。显然startlength参数都是整数。
但是其单位则可能是字符数或字节数。


LEFT()函数
函数的语法格式为 LEFT(character_expression,integer_expression)
LEFT()函数会从字符串表达式character_expression最左边的字符开始算起返回integer_expression参数所指定个数的字符。
integer_expression代表字符数而不是字节数而且即使character_expression内含中文文字中文文字也视为占用1个字符位置而不是2个字符位置。
字符串表达式character_expression必须是charncharvarcharnvarcharbinaryvarbinary数据类型。


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 CoordinateGreenwichMeanTime)的日期时间值。


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自动转换就必须使用转换函数做显示转换CASTCONVERT函数是数据类型转换函数功能相同只是函数语法格式不同。
CAST函数语法格式如下
CAST(表达式 AS 数据类型)
CONVERT函数语法格式如下
CONVERT(数据类型表达式 [样式])

例使用CASTCONVERT函数进行数据类型转换。

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所使用的比较运算符运算规则见下表
在这里插入图片描述
除了textntextimage数据类型的表达式外比较运算符可以用于所有的表达式结果是boolean数据类型。它有3个值TRUEFALSEUNKNOWN。返回boolean数据类型的表达式称为布尔表达式。与其他SQL Server数据类型不同boolean数据类型不能被指定为表列或变量的数据类型也不能在结果集中返回。
可以使用SET ANSI_NULLS设置比较运算结果显示。当SET ANSI_NULLSON时带有一个或两个NULL表达式的运算符返回UNKNOWN。当SET ANSI_NULLSOFF时上述规则同样适用但是两个表达式均为NULL则等号=运算符返回TRUE

例声明变量为整型类型并赋值进行比较运算。

SET ANSI_NULLS ON
IF 5<6                   	 /* 不显示比较结果只根据结果选择执行语句 */
--如果“5<6”比较结果为TRUE执行SELECT语句
   SELECT 'OK'
GO

6. 逻辑运算表达式符
逻辑运算符对某些条件进行测试。逻辑运算符和比较运算符一样返回带有TRUEFALSE值的boolean数据类型。SQL Server所使用的逻辑运算符运算规则见如下表
在这里插入图片描述
其中ALLANYBETWEENEXISTSLIKESOME通常用于数据库查询。

例声明变量为整型类型并赋值进行比较运算。

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语句嵌套时一定要注意IFELSE的配对。而且T-SQL语言没有限定IF…ELSE语句嵌套的层数但一般嵌套不要超过3层否则将降低程序的可读性。

2.4 WHILE、BREAK、CONTINUE 语句

WHILE语句设置重复执行SQL语句或语句块的条件。只要指定的条件为TRUE就重复执行语句。可以使用BREAKCONTINUE关键字在循环内部控制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 TRYBEGIN 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个语句见如下表
在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6