第 3 章 Transact SQL 语言概述 -...

31
第3章 Transact- SQL 语言概述 教学提示T-SQL(Transact-SQL)语言是当前最流行的数据库语言,是微软公司对美国 国家标准局制定的 SQL 最新 ANSI SOL92 的扩展,是 SQL Server 2000 的核心组件之一。 虽然 SQL Server 也提供了通过可视化用户界面选择查询条件,并能在内部自动生成向服务 器进行查询的语句,但是要编写具有实际用途的客户端服务器模式下的数据库应用程序, 必须借助于 Transact-SQL教学目标:本章重点讲述 Tansact-SQL 的标识符、数据类型、常量、变量、函数、运 算符和 Tansact-SQL 语句。 3.1 SQL 语言基本知识 SQL 是结构化数据库查询语言(Structured Query Language)的英文缩写,是一种使用关 系模型的数据库应用语言。 SQL 最早是在 20 世纪 70 年代由 IBM 公司开发出来的,作为 IBM 关系数据库原型 System R 的原形关系语言,主要用于关系数据库中的信息检索。 3.1.1 Transact-SQL 语言概述 Transact-SQL 语句是 ANSI SQL 的扩充语言,除继承了 ANSI SQL 的命令和功能外, 还对其进行了许多扩充,并且不断地变化、发展。它提供了类似 C 程序设计语言的基本功 能,如变量说明、功能函数、程序流程控制语言等。 Transact-SQL 语句的分类如下所示。 变量声明 Transact-SQL 语言可以使用两类变量,局部变量和全局变量。 数据定义语言(Data Definition LanguageDDL),用来建立数据库及数据库对象, 绝大部分以 CREATE 开头,如 CREATE TABLE 等。 数据控制语言(Data Control LanguageDCL),用来控制数据库组件的存取许可、权 限等命令,如 GRANTREVOKE 等。 数据操纵语言(Data Manipulation LanguageDML),用来操纵数据库中数据的命令, SELECTUPDATE 等。 流程控制语言(Flow Control LanguageFCL),用于控制应用程序流程的语句,如 IFCASE 等。 3.1.2 Transact-SQL 语言基本对象 本节主要介绍 Transact-SQL 语言的基本对象。 1. 标识符 SQL Server 2000 中,标识符就是指用来定义服务器、数据库、数据库对象和变量等

Transcript of 第 3 章 Transact SQL 语言概述 -...

Page 1: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3 章 Transact- SQL 语言概述

教学提示:T-SQL(Transact-SQL)语言是当前最流行的数据库语言,是微软公司对美国

国家标准局制定的 SQL最新 ANSI SOL92的扩展,是 SQL Server 2000的核心组件之一。

虽然 SQL Server也提供了通过可视化用户界面选择查询条件,并能在内部自动生成向服务

器进行查询的语句,但是要编写具有实际用途的客户端服务器模式下的数据库应用程序,

必须借助于 Transact-SQL。

教学目标:本章重点讲述 Tansact-SQL 的标识符、数据类型、常量、变量、函数、运

算符和 Tansact-SQL语句。

3.1 SQL 语言基本知识

SQL是结构化数据库查询语言(Structured Query Language)的英文缩写,是一种使用关

系模型的数据库应用语言。SQL最早是在 20世纪 70年代由 IBM公司开发出来的,作为 IBM

关系数据库原型 System R的原形关系语言,主要用于关系数据库中的信息检索。

3.1.1 Transact-SQL 语言概述

Transact-SQL语句是 ANSI SQL的扩充语言,除继承了 ANSI SQL的命令和功能外,

还对其进行了许多扩充,并且不断地变化、发展。它提供了类似 C程序设计语言的基本功

能,如变量说明、功能函数、程序流程控制语言等。

Transact-SQL语句的分类如下所示。

① 变量声明 Transact-SQL语言可以使用两类变量,局部变量和全局变量。

② 数据定义语言(Data Definition Language,DDL),用来建立数据库及数据库对象,

绝大部分以 CREATE开头,如 CREATE TABLE等。

③ 数据控制语言(Data Control Language,DCL),用来控制数据库组件的存取许可、权

限等命令,如 GRANT、REVOKE等。

④ 数据操纵语言(Data Manipulation Language,DML),用来操纵数据库中数据的命令,

如 SELECT、UPDATE等。

⑤ 流程控制语言(Flow Control Language,FCL),用于控制应用程序流程的语句,如 IF、

CASE等。

3.1.2 Transact-SQL 语言基本对象

本节主要介绍 Transact-SQL语言的基本对象。

1. 标识符

在 SQL Server 2000中,标识符就是指用来定义服务器、数据库、数据库对象和变量等

Page 2: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·47·

·47·

的名称。可分为常规标识符和分隔标识符。SQL Server为对象标识符提供了一系列标准的

命名规则,并为非标准的标识符提供了使用分隔符的方法。

1) 常规标识符

常规标识符符合标识符的格式规则,常规标识符就是不需要使用分隔标识符进行分隔

的标识符。在 SQL Server 2000中,常规标识符的格式规则取决于数据库的兼容级别,兼容

级别可以用存储过程来设置。

(1) 一般规则如下所述。

① 第一个字符必须是字母、下划线(_)、at符号(@)和数字标记(#)。

② 第一个字符后,标识符可以是字母、来自基本拉丁字母或其他国家/地区脚本的十

进制数字、美元符号($)、下划线(_)、at符号(@)和数字标记(#)。

③ 标识符不能是 Transact-SQL的保留字。

④ 不允许嵌入空格或其他特殊字符。

⑤ 常规标识符和分隔标识符包含的字符数必须在 1~128。

(2) 以符号开始的标识符名称具有的特殊用途如下所述。

① 以 @ 符号开始的标识符表示局部变量或参数。

② 以 @@ 双符号开始的标识符表示全局变量。

③ 以数字标记#符号开始的标识符表示临时表或过程。

④ 以数字标记##双符号开始的标识符表示全局临时对象。

2) 分隔标识符

如果标识符遵从标识符格式的所有规则,则既可以使用分隔符,也可以不使用分隔符。

对不符合标识符的格式规则的标识符必须进行分隔。

(1) 分隔标识符类型有以下两种。

① 被引用的标识符用双引号(“”)分隔开。

② 括在括号中的标识符用方括号([ ])分隔。

(2) 分隔标识符的格式规则如下所述。

① 分隔标识符可以包含与常规标识符相同的字符数(1~128个,不包括分隔符字符)。

② 标识符的主体可以包含当前代码页内字母(分隔符本身除外)的任意组合。

(3) 分隔标识符在下列情况下使用。

① 当在对象名称或对象名称的组成部分中使用保留字时,推荐不要使用保留关键字作

为对象名称,可用分隔标识符引用对象直到可改变其名称。

② 当使用未被列为合法标识符的字符时,允许在分隔标识符中使用当前代码页中的任

何字符。

2. 引用 SQL Server对象

可以通过几种方法引用 SQL Server对象。既可以指定对象的完整名称,也可以只指定

对象的部分名称,让 SQL Server根据当前操作的上下文环境确定名称的其余部分。

(1) 完全合法名称

SQL Server对象的完整名称包括 4个标识符:服务器名称、数据库名称、所有者名称

和对象名称。其格式为: Server.database.owner.object

Page 3: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·48·

·48·

指定了所有 4部分的对象名称被称为完全合法名称。SQL Server中所创建的每一个对

象必须具有唯一的完全合法名称。

例如,在同一个数据库中可以有两个名称为部门信息的表,只要是分属于不同的所有

者即可。

同样地,同一个表或视图中的列名也必须唯一。

(2) 部分指定名称

当引用一个对象时,不需要指定服务器、数据库和所有者,可以利用句点指出其位置,

从而省略限定符。

下面列出对象名称的有效格式: Server.database.owner.object

database.owner.object

database.Object

owner.object

object 若创建一个对象时没有指定该名称的不同部分,SQL Server则使用以下默认值。

① 服务器默认为本地服务器的当前实例。

② 数据库默认为当前数据库。

③ 所有者默认为指定数据库中与当前连接的登录标识(ID)相对应的用户名称。

3. 注释

注释语句是置于语句中的不可执行的字符串,在程序中加入注释说明,使程序更容易

维护及了解。注释中的所有内容不会被执行,因此可以在注释中编写有关程序内容的说明,

使程序变得易读。

在 SQL Server中提供了以下两种编写注释的方式。

(1) 嵌入行内的注释语句

可使用两个连字符(--)创建嵌入行内的注释语句,该符号将注释语句与语句分开。这个

注释语句字符也可以使某一行语句无效。

(2) 块注释语句

在注释文本的起始处输入“/*”,在注释语句的结束处输入“*/”,就可以把两个符号

间的所有字符变成注释语句,从而可以创建包含多行的块注释语句。应当尽可能多地在 SQL

脚本中使用注释语句,它们能够描述语句执行的操作。

例如, USE pubs /*使用 SQL Server 2000实例数据库 pubs*/

SELECT * FROM discounts /*从表 discounts查询所有记录 * /

3.2 数 据 类 型

数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存

储格式,代表了不同的信息类型。SQL Server提供了多种系统数据类型,也允许基于系统

数据类型的用户定义数据类型。用户定义的数据类型是在系统数据类型的基础上,使用存

Page 4: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·49·

·49·

储过程 sp addtype所建立的数据类型。

3.2.1 系统数据类型分类

可以按照存放在数据库中的数据的类型对 SQL Server提供的系统数据类型进行分类。

1.整数型

整数型包括 bigint、int、smallint和 tinyint 共 4种。

整数型数据由负整数或正整数组成,如-12、0、5和 2508。在 SQL Server 2000中,

整数型数据使用 bigint、int、smallint 和 tinyint 数据类型存储。bigint 数据类型可存储的数

字范围比 int数据类型广。int数据类型比 smallint数据类型的存储范围大,而 smallint的数

值范围又比 tinyint类型大。

各种类型能存储的数值的范围如下所述。

① bigint数据类型:大整数型,长度为 8个字节,可以存储-263(-9 223 372 036 854 775

808)~263-1(9 223 372 036 854 775 807)范围内的数字。

② int数据类型:整数型,长度为 4个字节,可存储范围是-231(-2 147 483 648)~231

-1(2 147 483 647)。

③ smallint数据类型:短整数型,长度为 2个字节,可存储范围只有-215(-32 768)~

215-1(32 767)。

④ tinyint数据类型:微短整数型,长度为 1个字节,只能存储 0~255 范围内的数字。

例如,下面的语句创建了一个表 Int_table,其中的 4个字段分别使用这 4种整数型。 USE test

CREATE TABLE Int_table

(

_tinyint tinyint,

_smallint smallint,

_int int,

_bigint bigint

)

INSERT Int_table VALUES(20,2000,20000,200000)

SELECT *FROM Int_table 执行结果,显示出表 Int_table中的一条记录,它包含了 4种数据类型,如图 3.1所示。

图 3.1 执行结果

2.小数数据类型

小数数据类型也称为精确数据类型,由两部分组成,其数据精度保留到最低有效位,

所以,小数数据类型以完整的精度存储十进制数。

在声明小数数据类型时,可以定义数据的精度和小数位。声明格式为: decimal[(p[, s])] 和 numeric[(p[, s])]

Page 5: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·50·

·50·

各参数含义如下所述。

(1) p(精度)

指定小数点左边和右边可以存储的十进制数字的最大个数。精度必须是从 1 到最大精

度之间的值,最大精度为 38。

(2) s(小数位数)

指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0~p 之间的

值。默认小数位数是 0,因而 0 <= s <= p。最大存储大小基于精度而变化。

例如,下面的语句创建一个表 Decimal _table。 USE test

CREATE TABLE Decimal_table

(

_decimal Decimal(3,2)

)

INSERT Decimal_table VALUES (1.2345)

SELECT * FROM Decimal_table 执行结果是显示出表 Decimal _table中的一条记录,如图 3.2所示。

图 3.2 执行结果

3.近似数值型

近似数值数据类型不能精确记录数据的精度,所保留的精度由二进制数字系统的精度

决定。SQL Server提供了两种近似数值数据类型。

(1) float [ ( n ) ]

从-1.79308~1.79308

之间的浮点数字数据。

n 为用于存储科学记数法 float 数尾数的位数,同时指示其精度和存储大小。n 必须为

从 1~53的值。它同精度和存储字节的关系见表 3-1。

表 3-1 n 与精度和存储字节之间的关系

n所在范围 精度 存储大小

1~24 7位数 4B

25~53 15位数 8B (2) real数据类型

从-3.4038~3.4038

之间的浮点数字数据,存储大小为 4B。

4.字符型

字符串存储时采用字符型数据类型。字符数据由字母、符号和数字组成。例如,“129”、

“Bill”等都是有效的字符数据。

提示:字符常量必须包括在单引号(‘’)或双引号(“” )中。

Page 6: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·51·

·51·

在 SOL Server中,字符数据使用 char、varchar和 text数据类型存储。当列中各项的字

符长度可变时可用 varchar类型,但任何项的长度都不能超过 8KB。当列中各项为同一固定

长度时使用 char类型(最多 8KB)。text数据类型的列可用于存储大于 8KB的 ASCII字符。

char、varchar和 text 三种类型的定义方式如下所述。

① char[(n)]:长度为 n个字节的固定长度且非 Unicode的字符数据,存储大小为 n个

字节。n必须是一个介于 1和 8000 之间的数值。

② varchar[(n)]:长度为 n个字节的可变长度且非 Unicode的字符数据。n必须是一个

介于 1和 8000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n个字节,所

输入的数据字符长度可以为零。

③ text数据类型:用来声明变长的字符数据。在定义过程中,不需要指定字符的长度。

最大长度为 231-1(2 147 483 647)个字符。当服务器代码页使用双字节字符时,存储量仍是

2 147 483 647字节。存储大小可能小于 2 147 483 647字节(取决于字符串)。

例如,下面的 SQL语句将局部变量MyCharVar 声明为 char类型,长度为 20: DECLARE @MyCharVar CHAR(20)

SET @MyCharVar=’This is a string’ 如果要存储的数据比允许的字符多,则多余部分被截断。

5.逻辑数值型

SQL Server 支持逻辑数据类型 bit,它可以存储整数型数据 l、0或 NULL。如果输入 0

以外的其他值时,SQL Server 均将其作为 l 看待。

SOL Server 优化用于 bit列的存储。如果一个表中有不多于 8个的 bit列,这些列将作

为一个字节存储。如果表中有 9~16个 bit列,这些列将作为两个字节存储。更多列的情况

依此类推。

注意:不能对 bit类型的列(字段)使用索引。 例如,下面的语句创建了一个表 Bit_table。 CREATE TABLE Bit_table

(

_bit1 bit,

_bit2 bit,

_bit3 bit

)

INSERT Bit_table VALUES (1,0,12)

SELECT * FROM Bit_table 执行结果是显示出表 Bit _table中的一条记录,如图 3.3所示。

图 3.3 执行结果

Page 7: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·52·

·52·

6.货币型

货币数据表示正的或负的货币值。在 SQL Server中使用 money和 smallmoney数据类

型存储货币数据。货币数据存储的精确度为 4 位小数。

money和 smallmoney数据类型存储范围和占用字节如下所述。

money 数据类型可存储的货币数据值介于-263(-922 337 203 685 477.5808)~263-

1(+922 337 203 685 477.5807)之间,精确到货币单位的万分之一,存储大小为 8个字节。

smallmoney数据类型可存储的货币数据值介于-214 748.3648~214 748.3647,精确到

货币单位的万分之一,存储大小为 4个字节。

例如,下面的语句创建了一个表Money_table。 CREATE TABLE Money_table

(

_money money,

_smallmoney smallmoney

)

INSERT Money_table VALUES ($12345678,$1234)

SELECT * FROM Money_table 执行结果是显示出表Money _table中的一条记录,如图 3.4所示。

图 3.4 执行结果

7.Unicode字符型

在 SQL Server 2000中,传统上非Unicode数据类型允许使用由特定字符集定义的字符。

字符集是在安装 SQL Server时选择的,不能更改。使用 Unicode(统一字符编码标准)数据类

型,列(字段)可存储由 Unicode标准定义的任何字符,包含由不同字符集定义的所有字符。

Unicode数据类型需要相当于非 Unicode数据类型两倍的存储空间。

Unicode数据使用 SQL Server中的 nchar、varchar和 ntext数据类型进行存储。对于存

储来源于多种字符集的字符的列,可采用这些数据类型。当列中各项所包含的 Unicode 字

符数不同时(至多为 4000),使用 nvarchar类型。当列中各项为同一固定长度时(至多为 4000

个 Unicode字符),使用 nchar类型。当列中任意项超过 4000个 Unicode字符时,使用 ntext

类型,其最大长度为 230-1。它们分别与字符型的 char[(n)]、varchar[(n)]和 text类型相对应。

使用 Unicode字符时,应该在前面加一个标识符 N,但是存储时并不存储该标识符。

例如,下面的 Transact-SQL 语句将局部变量 MyUnicodeVar 声明为 Unicode 字符型,

长度为 25。 DECLARE @ MyUnicodeVar NCHAR(25)

Set @ MyUnicodeVar=N’This is a Unicode string.’

PRINT @MyUnicodeVar 执行结果为: This is a Unicode string.

Page 8: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·53·

·53·

8.日期时间类型

SQL Server提供了专门的日期时间类型。日期和时间数据由有效的日期或时间组成。

例如,“4/01/2005 12:15:00:00:00 PM”和“l:28:29:15:01 AM 8/17/2005”都是

有效的日期和时间数据。

在 SQL Server中,日期和时间数据使用 daytime和 smalldatetime数据类型存储。

① datetime 从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据,精确度为

3‰s(3ms或 0.003s)。

② smalldatetime从 1900年 1 月 1 日到 2079年 6 月 6 日的日期和时间数据,精确到分

钟。29.998s 或更低的 smalldatetime 值向下舍入为最接近的分钟,29.999s 或更高的

smalldatetime 值向上舍入为最接近的分钟。

例如,下面的语句创建了一个表 DataTime_table。 CREATE TABLE DataTime_table

(

_datetime datetime,

_smalldatetime smalldatetime

)

INSERT DataTime_table VALUES ('4-16-2006 03:48:39.257','04/16/2006

13:30:20 PM')

SELECT * FROM DataTime_table 执行结果是显示出 DataTime _table中的一条记录,如图 3.5所示。

图 3.5 执行结果

SQL Server可以识别的日期格式有字母格式、数字格式和无分隔字符串格式 3种。字

符格式允许使用以当前语句给出的月全名(如 April)或月的缩写(如 Apr)来指定日期数据。字

符格式的日期需要放在单括号内。可用的字符型日期格式分别为: Apr[il][15][,]2006

Apr[il][15][,][20]06

Apr[il]2006[15]

[15]Apr[il][,]2006

15Apr[il][,][20]06

15[20]06Apr[il]

2006APR[IL][15]

2006 [15]APR[IL] 数字格式允许用指定的数字月份指定日期数据。

例如,5/20/06表示 2006年 5 月 20 日,当使用数字日期格式时,在字符串中以斜杠(/)、

连字符(-)或句点(.)作为分隔符来指定日、月、年。

例如,下面均表示 2006年 4 月 15 日(----后面指明的是日期格式): [0]4/15/[20]06 ----(mdy)

Page 9: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·54·

·54·

[0]4–15-[20]06 ----(mdy)

[0]4.5.[20]06 ----(mdy)

[04]/[20]06/15 ----(myd)

15/[0]4/[20]06 ----(dmy)

15/[20]06/[0]4 ----(dym)

[20]06/15/[0]4 ----(ydm)

[20]06/[04]/15 ----(ymd) 无分隔字符串格式是指数字间不需要分隔符号,可以使用 4、6、8 位数字来表达日期。

如果使用 4 位表示,则只表示年份;如果使用 6 位或者 8 位,月和日必须用两位。

例如“20061207”、“December 12,2006”。

SQL Server 2000可以识别以下时间数据格式。用单引号(‘’)把每一种格式括起来。下面

都是有效的时间格式: 14:30

14:30[:20:999]

14:30[:20.9]

4 Am

4 PM

[0]4[:30:20:500]AM 可以用一个 AM或 PM后缀来表明时间值是在中午 2 点之前还是之后。AM或 PM的

大小写可忽略,小时可以用 12 小时或 24 小时的时钟来指定。

小时值解释如下。

小时值 0表示午夜(AM)后的小时,不论是否指定 AM。当小时值等于 0时不能指定 PM。

如果未指定 AM和 PM,小时值 12表示始于中午的小时。如果指定为 AM,则表示始

于午夜的小时。如果指定为 PM,则表示始于中午的小时。例如,12:01 是指中午过后 1

分钟,即 12:01 PM,而 12:01 AM是指午夜过后 1分钟。指定为 12:01 AM与指定为

00:01或 00:01 AM相同。

如果指定 AM或 PM,小时值 13~23表示中午以后的小时。当指定 PM时,也表示中

午以后的小时。当小时值为 13~23时,不能指定为 AM。

小时值 24 无效,用 12:00AM或 00:00表示午夜。

9.二进制数据类型

二进制数据由十六进制数表示。例如,十进制数 245等于十六进制数 F5。在 SQL Server

2000中,二进制数据使用 binary、varbinary和 image数据类型存储。

① binary数据类型在每行中都是固定的长度(最多为 8KB)。

② varbinary数据类型在每行中所包含的十六进制数字的个数可以不同(最多为 8KB)。

③ image数据类型可以用来存储超过 8 KB的可变长度的二进制数据,如Word文档、

Excel 电子表格、位图图像、图形交换格式(GIF)文件和联合图像专家组(JPEG)文件。

三种数据类型的声明格式如下所述。

① binary[(n)]:固定长度的 n个字节二进制数据。n必须在 1~8000内,存储空间大小

为 n+4个字节。

② varbinary[(n)]:n个字节变长二进制数据。n必须在 1~8000。存储空间大小为实际

输入数据长度加上 4个字节,而不是 n个字节。输入的数据长度可能为 0字节。

Page 10: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·55·

·55·

③ image可变长度二进制数据:在 0~231-1(2 147 483 647)字节之间。

二进制常量以 0x(一个零和小写字母 x)开始,后面跟着位模式的十六进制表示。0x2A

表示十六进制的值 2A,它等于十进制的数 42或单字节位模式 00101010。

例如,下面的语句创建一个表 Binary _table。 CREATE TABLE Binary_table

(

_binary binary(10),

_varbinary varbinary(20),

_image image

)

INSERT Binary_table VALUES (0x123,0xBBB,0x14FFFF)

SELECT * FROM Binary_table 执行结果是显示出表 Binary _table中的一条记录,如图 3.6所示。

图 3.6 执行结果

10.其他数据类型

在 SQL Server 2000中,还提供了其他几种数据类型,包括下面几种。

① cursor 游标数据类型,用于创建游标变量或者定义存储过程的输出参数。它是唯一

的一种不能赋值给表的列(字段)的基本数据类型。

② Sql variant数据类型,可以存储除了 text、ntext、timestamp和自己本身以外的其他

所有类型的变量。

③ table数据类型,能够保存函数结果,并将其作为局部变量数据类型,可以暂时存

储应用程序的结果,以便在以后用到。

④ uniqueidentifier数据类型,全局唯一标识符,是一个 16字节长的二进制数据类型,

是 SQL Server 根据计算机网络适配器地址和主机 CPU 时钟产生的唯一号码而生成的全局

唯一标识符代码。唯一标识符代码可以通过调用 NEWID函数或者其他 SQL Server应用程

序编程接口来获得。

⑤ timestamp 时间戳数据类型,可以反映数据库中数据修改的相对顺序。

3.2.2 用户定义数据类型

用户定义的数据类型总是根据基本数据类型进行定义的。在创建一个用户定义的数据

类型时,必须给出以下 3部分信息。 � 新数据类型的名称。 � 新数据类型所依据的系统数据类型。 � 数据类型是否允许为空值。

如果用户定义的数据类型是在 model数据库中创建的,将作用于所有用户定义的新数

Page 11: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·56·

·56·

据库中。如果数据类型是在用户定义数据库中创建的,则只作用于此用户定义的数据库。

有以下两种方式可以创建用户定义的数据类型。

1. 通过企业管理器来创建用户定义的数据类型

通过企业管理器来创建用户定义的数据类型的操作步骤如下所述。

① 展开企业管理器,并将服务器展开。

② 展开【数据库】文件夹,再展开要在其中创建用户定义的数据类型的数据库。

③ 右击【用户定义数据类型】选项,然后选择【新建用户定义的数据类型】命令。此

时,会打开“用户定义的数据类型属性”对话框。

④ 在【名称】文本框中输入新建数据类型的名称(入 myDataType);在【数据类型】

下拉列表中,选择其数据类型(如 char);在【长度】文本框中输入长度(如:8000);

在【允许 NULL 值(U)】可选框中选择是否允许 NULL 值;在【规则】和【默认值】下

拉列表中选择一个规则或默认值,将其绑定到用户定义的数据类型上,如图 3.7所示。

图 3.7 创建用户定义的数据类型

⑤ 设置完成后,单击【确定】按钮,即可创建一个用户定义的数据类型。

上面创建的数据类型可以在当前数据库中定义新表时使用,即这时可使用一种名为

myDataType的数据类型,它只能是长度为 8000的定长字符类型,允许 NULL 值。

2. 在查询分析器中使用系统存储过程 sp addtype 创建用户定义数据类型

在查询分析器中输入如下命令并执行即可创建用户定义数据类型: Sp addtype @typename=address , @phystype =’char(30)’,@nulltype =’not

null’

如图 3.8所示。

若要删除用户定义的数据类型,则可在该用户定义数据类型上右击鼠标,然后选择【删

除】命令,在打开的【除去对象】对话框中,单击【全部删除】按钮,即可删除用户定义

的数据类型。

Page 12: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·57·

·57·

图 3.8 用查询分析器创建用户定义数据类型

3.3 Transact-SQL 变量

变量是 Transact-SQL中由用户定义、可对其赋值并参与运算的一个实体,可分为全局

变量和局部变量两类。其中全局变量由系统定义并维护,全局变量名称前面有两个@字符,

任何程序均可随时调用。局部变量名称前面有一个@字符,由用户定义和使用。

3.3.1 局部变量

局部变量一般出现在批处理、存储过程和触发器中,如果要使用局部变量,必须在使

用前以 DECLARE语句定义。局部变量仅生存于声明它的批处理存储过程或触发器中,处

理结束后,存储在局部变量中的信息将丢失。

1. 局部变量声明

在使用 DECLARE语句来声明局部变量时,必须提供变量名称及数据类型。变量名前

必须有一个@符号,变量名称的最大长度为 30个字符。声明变量时可使用任何系统定义的

数据类型或用户自定义的数据类型。

DECLARE的语法是: DECLARE @variable_name datatype[,…]

各参数的含义如下所述。

① @variable_name 是变量的名称。变量名必须以@开头。局部变量名必须符合标识

符规则。

② datatype 是任何由系统提供的或用户定义的数据类型。变量不能是 text、ntext 或

image数据类型。

在 SQL Server中,一次可以定义多个变量。例如: DECLARE @name varchar(30) ,@Age int

2. 局部变量赋值

在 SQL中,通常用 SET和 SELECT语句为变量赋值,其语法格式为:

Page 13: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·58·

·58·

SET @variable_name=expression

SELECT @variable_name=expression

其中,@variable_name为定义的局部变量名称,expression为表达式。

下面的语句是为变量@Name 赋予常数“程立”,为变量@Age 赋予常数“22”。 DECLARE @name varchar(30) ,@Age int

SET @name='程立'

SELECT @Age=22

注意:在局部变量没有被赋值之前,其值是 NULL,如果要在程序体中引用,特别是在循

环结构中,必须先为其赋值。

下面例子中的语句定义一个整数变量,并将其作为循环计数器使用,是一个执行 10 次

的循环: DECLARE @counter int

SELECT @counter=0

WHILE @counter<10

BEGIN

SELECT @counter=@counter+1

SELECT @counter /*本行将计数器的值输出到屏幕上*/

END

3.3.2 全局变量

全局变量通常用来跟踪服务器范围和特定会话期间的信息,不能明显地被赋值或声明。

全局变量不能由用户定义,也不能由应用程序在处理器之间交叉传递信息,这一点在许多

第三代及第四代语言中都有说明。表 3-2列出 SQL Server2000中较常见的全局变量。

表 3-2 SQL Server2000 中较常用的全局变量

变量 说明

@@connections SQL Server自启动以来建立的连接数

@@cpu_busy SQL Server自启动以来系统处理的毫秒数

@@cursor_rows 打开游标时满足条件的行数

@@datefirst 值为 1~7,指定每周的星期几为第一天

@@dbts 最后一次的 timestamp值

@@error 前一条 SQL语句报告的错误号

@@fetch—status 游标中上条 FETCH语句的状态

@@identity 上次 INSERT操作中使用的 IDENTITY值

@@idle 上次启动 SQL Server以来闲置的毫秒数

@@io_busy 上次启动 SQL Server以来用于输入输出操作的毫秒数

@@langid 当前所用语言的 ID号

@@language 当前所用语言的名称

@@lock_timeout 返回用 SET语句设置的锁定超时的值,以毫秒为单位

Page 14: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·59·

·59·

(续)

变量 说明

@@max_connections 返回服务器允许的最大的并发用户数

@@max_precision 返回 decimal及 numeric型数据的最大精度

@@nestlevel 当前执行的存储过程的嵌套层数

@@options 返回当前的 SET选项的设置信息

@@pack_received 上次启动 SQL Server以来从网络上接收的输入包数

@@pack_sent 上次启动 SQL Server以来向网络上发送的输出包数

@@packet_errors 上次启动 SQL Server以来网络上发生的错误包的数目

@@procid 返回当前执行的存储过程的 ID号

@@remserver 返回远程 SQL Server数据库服务器的名称

@@rowcount 前一条命令处理的行数

@@servername 本地 SQL Server的名称

@@servicename 正在运行的 SQL Server的注册名

@@textsize 用 SET语句设置的当前 TEXTSIZE值,以字节为单位

@@total_errors 上次启动 SQL Server以来的磁盘读写错误数

@@trancount 事务嵌套的级别

@@transtate 事务的当前状态

@@tranchained 当前事务的模式

@@total_read 上次启动 SQL Server以来发生的读磁盘次数

@@version SQL Server和 O/S版本级别

@@spid 当前进程 ID

@@total_weite 上次启动 SQL Server以来发生的写磁盘错误 若要查询上述这些全局变量的值,只需在查询分析器中写上 SELECT全局变量名并执

行即可。例如,SELECT @@VERSION 将返回 SQL Server的版本信息。

3.4 运 算 符

运算符是一种符号,用来指定要在一个或多个表达式中执行的操作。SQL Server提供

的运算符有算术运算符、赋值运算符、按位运算符、比较运算符、逻辑运算符、字符串连

接运算符和一元运算符。

3.4.1 算术运算符

算术运算符用于数值型列或变量间的算术运算。算术运算符包括加(+)、减(-)、乘(*)、

除(/)和取模(%)运算。取模运算返回一个除法的整数余数。例如,17%3=2,这是因为 17

除以 3的余数为 2。

另外,加(+)和减(-)运算符也可用于对 datetime 及 smalldatetime 值执行算术运算,其

Page 15: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·60·

·60·

使用格式是:

日期±整数

该表达式返回“日期”加上或减去“整数”天数的日期。

例如, SELECT CAST('2006-1-1' AS smalldatetime)+100

执行的结果如图 3.9所示。

图 3.9 执行结果

3.4.2 赋值运算符

Transact-SQL有一个赋值运算符,即等号(=)。它将表达式的值赋予另外一个变量。

例如,下面的 SQL语句先声明一个变量,然后将一个取模运算的结果赋予该变量,最

后是打印该变量的值: DECLARE @MyCounter INT

SET @MyCounter=27%4

PRINT CONVERT(varchar(255),@MyCounter) 执行结果为:

3

3.4.3 按位运算符

按位运算符可以对两个表达式进行位操作,这两个表达式可以是整型数据或者二进制

数据。按位运算符包括& (按位与)、| (按位或)和^ (按位异或)。

Transact-SQL 首先把整数数据转换为二进制数据,然后再对二进制数据进行按位运算。

例如,下面的 SQL语句对两个变量进行按位运算: DECLARE @a INT,@b INT

SET @a=5

SET @b=10

SELECT @a&@b AS'a&b',@a|@b AS 'a|b',@a^@b AS 'a^b' 执行结果为: a&b a︱b a^b

0 15 15

3.4.4 比较运算符

比较运算符用来比较两个表达式,表达式可以是字符、数字或日期数据,并可用在查

询的WHERE或 HAVING 子句中。比较运算符的计算结果为布尔数据类型,根据测试条件

的输出结果返回 TRUE或 FALSE。

Page 16: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·61·

·61·

SQL Server提供的比较运算符有下面几种。

① > (大于)。

② < (小于)。

③ = (等于)。

④ <= (小于或等于)。

⑤ >= (大于或等于)。

⑥ != (不等于)或<>(不等于)。

⑦ !< (不小于)。

⑧ !> (不大于)。

3.4.5 逻辑运算符

逻辑运算符用来判断条件是 TRUE或者 FALSE,SQL Server 总共提供了 l0个逻辑运

算符,见表 3-3。

表 3-3 逻辑运算符

逻辑运算符 含义

ALL 当一组比较关系的值都为 TRUE时,才返回 TRUE

AND 当要比较的两个布尔表达式的值都为 TRUE,才返回 TRUE

ANY 只要一组比较关系中有一个值为 TRUE,就返回 TRUE

BETWEEN 只有操作数在定义的范围内,才返回 TRUE

EXISTS 如果在子查询中存在,就返回 TRUE

IN 如果操作数在所给的列表表达式中,则返回 TRUE

LIKE 如果操作数与模式相匹配,则返回 TRUE

NOT 对所有其他的布尔运算取反

OR 只要比较的两个表达式有一个为 TRUE,就返回 TRUE

SOME 如果一组比较关系中有一些为 TRUE,则返回 TRUE 由于 LIKE使用部分字符串来查询记录,因此,在部分字符串中可以使用通配符。SQL

Server中可以使用的通配符及其含义见表 3-4。

表 3-4 通配符及其含义

通配符 含义

% 代表 0个或多个任意字符

_(下划线) 代表任意 1个字符

[ a-f] 指定范围([a~f])或集合([abcdef])中的任何单个字符

[aef] 代表字符 a、e或 f

[^a-f] 不属于指定范围([a~f])或集合([abedef])的任何单个字符

[^aef] 除了 a、e或 f之外的任意一个字符

Page 17: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·62·

·62·

提示:在使用通配符时,一个汉字算一个字符。另外,当使用 LlKE 进行字符串比较时,

模式字符串中的所有字符都有意义,包括起始或尾随空格。如果查询中的比较要返

回包含 abc(abc 后有一个空格)的所有行,则将不会返回包含 abc(abc 后没有空格)的

所有行。因此,对于 datetime数据类型的值,应当使用 LIKE进行查询,因为 datetlime

项可能包含各种日期部分。

例如,在一个 Transact-SQL语句中写出如下子句,分别表示不同的意义。 WHERE book_name LIKE ’%计算机%’

表示在 book_name字段中查找包含“计算机”3个字的书。 WHERE year_born LIKE ’197_’

表示在 year_born字段中查找 20世纪 70年代出生的人。 WHERE year_born LIKE ’197[1-4]’

表示在 year_born字段中查找 1971~1974年出生的人。 WHERE year_born LIKE ’197[^0-4]’

表示在 year_born字段中查找 1975~1979年出生的人。

3.4.6 字符串连接运算符

字符串连接运算符为加号(+)。可以将两个或多个字符串合并或连接成一个字符串。还

可以连接二进制字符串。

例如,下面的 SQL语句将两个字符串连接在一起: SELECT(’abcxy’+’def’) As ‘串连接’

执行结果为: 串连接

abcxydef

注意:其他数据类型,如 datetime 和 smalldatetime,在与字符串连接之前必须使用 CAST

转换函数将其转换成字符串。

3.4.7 一元运算符

一元运算符是指只有一个操作数的运算符。

SQL Server提供的一元操作符包含+(正)、-(负)和 ~ (位反)。

正和负运算符表示数据的正和负,可以对所有的数据类型进行操作。位反运算符返回

一个数的补数,只能对整数数据进行操作。

例如,下面的 SQL语句,首先声明一个变量,并对变量赋值,然后对变量取负。 DECLARE @Num1 int

SET @Num1=6

SELECT -@Num1 As '位反运算' 执行结果是: 位反运算

-6

Page 18: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·63·

·63·

3.4.8 运算符优先级

一般来说,可以在允许使用表达式的场合用运算符将常量、变量、对象等连接起来,

形成新的表达式。使用运算符可以构造出相当复杂的表达式,当一个复杂的表达式有多个

运算符时,运算符优先级决定执行运算的先后次序。可以使用括号来改变优先顺序,有时

括号会使得表达式的求值顺序变得清晰。

在 SQL Server中,运算符的优先级如下所示。

① +(正)、- (负)、~ (按位 NOT)。

② * (乘)、/(除)、%(模)。

③ +(加)、+(连接)、- (减)。

④ =、>、<、>=、<=、<>、!=、!>和!<比较运算符。

⑤ ^ (位异或)、& (位与)、| (位或)。

⑥ NOT。

⑦ AND。

⑧ ALL、ANY、BETWEEN、IN、LIKE、OR、SOME。

⑨ = (赋值)。

当一个表达式中的两个运算符有相同的运算符优先级时,基于在表达式中的位置对其

从左到右进行求值。

例如, DECLARE @MyNumber int

SET @MyNumber=6-1+2+2

SELECT @MyNumber As’计算结果’ 执行结果为: 计算结果

9 使用括号可以提高运算符的优先级,首先对括号中的内容进行求值,从而产生一个值,

然后括号外的运算符才可以使用这个值。如果有嵌套的括号,则处于最里面的括号最先

计算。

例如, DECLARE @MyNumber int

SET @MyNumber=8*(5+(3–2))

SELECT @MyNumber As '计算结果' 执行结果为: 计算结果

48

3.5 函 数

Transact-SQL 语言提供了丰富的数据操作函数,用以完成各种数据管理工作。SQL

Server 2000数据库管理人员必须掌握 SQL Server 2000的函数功能,并将 Transact-SQL语

Page 19: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·64·

·64·

言的程序或脚本与函数相结合,这将极大地提高数据管理工作的效率。

3.5.1 数学函数

SQL Server 2000中提供了许多数学函数,可以满足数据库维护人员日常的数值计算要

求。常用的数学函数见表 3-5。

表 3-5 SQL Server 2000 中的数学函数

函数名称 函数功能简述

ABS 求绝对值

ACOS 反余弦函数

ASIN 反正弦函数

ATAN 反正切函数

ATN2 增强的反正切函数

CEILING 求仅次于最大值的值

COS 余弦函数

COT 余切函数

DEGREE 角度转弧度

EXP 计算 e的 x次幂

FLOOR 求仅次于最小值的值

LOG 求自然对数

LOG10 增强的自然对数

PI 常量,圆周率

POWER 求 x的 y次方

RADIANS 角度转弧度

RAND 求随机数

ROUND 指定小数的位数

SIN 正弦函数

SQUARE 开方

SQRT 求平方根

TAN 正切函数

3.5.2 日期/时间函数

SQL Server 2000提供了众多的日期和时间函数,用于进行时间方面的处理工作。

在 datetime 值上操作是常规的做法,例如,“获取当前日期”,“做日期算术,计算

50天后是什么日期”或者“指出特别的日期是星期几”。

(1) GETDATE( )函数

GETDATE( ) 函数用于返回 SQL Server 2000系统中的当前日期时间。

Page 20: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·65·

·65·

(2) DATEADD( )函数

DATEADD( )函数用于进行两个时间数据的相加,返回新的日期/时间。

(3) DATEDIFF( )函数

DATEDIFF( ) 函数用于返回两个指定时间之间的间隔。

(4) DATENAME( )函数

DATENAME( )函数用于返回一个指定的时间名字。例如,当前的年、月或者日的名称。

(5) DATEPART( )函数

DATEPART( )函数和 DATENAME() 函数极其相似,只不过该函数返回的是具体的时

间数值而不是时间的名称。

datetime参数是具有 SQL Server的 datetime数据类型的任何表达式或是可以隐式转换

的参数,例如,像 2006.10.31 这样的适当格式化的字符串。datetime 参数使用表 3-6 中所

示的编码,不论全名或缩写都可以作为参数传递。

表 3-6 datetime 的参数值

日期/时间(函数名称) 缩 写 值

Year Yy 1753~9999

Quarter Qq 1~4

Month Mm 1~12

Dayofyear Dy 1~366

Day Dd 1~31

Week Wk 1~53

weekday Dw 1~7(Sunday-Saturday)

Hour Hh 0~23

minute Mi 0~59

second Ss 0~59

millisecond Ms 0~999

3.5.3 聚合函数

聚合函数在结果集中通过对被选列值的收集处理并返回一个数值型的计算结果。

(1) AVG( )函数

该函数用于计算大量数据的平均值。

(2) COUNT( )函数

在进行数据查询时,该函数可以返回参数中非 NULL值的数目。

(3) SUM( )函数

该函数用于计算指定数据项的总和。

(4) MAX( ) 函数和MIN( ) 函数

MAX ( )函数和MIN( )函数用于计算多个数据项当中的极值(最大值和最小值)。

Page 21: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·66·

·66·

3.5.4 字符串函数

SQL Server 2000中的字符串函数有很多个,主要用来处理二进制类型的数据和文本类

型的数据。表 3-7列出常见的字符串函数。

表 3-7 常见字符串函数

函数名称 函数功能简述

ASCII 返回字符表达式最左端字符的 ASCII代码值

CHAR 将 ASCII 代码转换为字符的字符串函数,ASCII 码应是介于 0~255 的整数,否则将

返回 NULL值

CHARINDEX 返回字符串中指定表达式的起始位置

DIFFERENCE 以整数返回两个字符表达式的 SOUNDEX 值之差,返回的整数是 SOUNDEX 值中相

同字符的个数,返回的值从 0~4不等,4表示 SOUNDEX值相同

LEFT 返回从字符串左边开始指定个数的字符

LEN 返回给定字符串表达式的字符个数,其中不包含尾随空格

LOWER 将大写字符数据转换为小写字符数据后返回字符表达式

LTRIM 删除起始空格后返回字符表达式

NCHAR 根据 Unicode标准所进行的定义,用给定整数代码返回 Unicode字符

PATINDEX 返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据

类型中没有找到该模式,则返回 0

QUOTENAME 返回带有分隔符的 Unicode 串,分隔符的加入可使输入的字符串成为有效的 SQL

Server 分隔标识符

REPLACE 用第 3个表达式替换第一个字符串表达式中出现的所有第 2个给定字符串表达式

REPLICATE 以指定的次数重复字符表达式

REVERSE 返回字符表达式的反转

RIGHT 返回从字符串右边开始指定个数的字符

RTRIM 截断所有尾随空格后返回一个字符串

SOUNDEX 返回由 4个字符组成的代码(SOUNDEX),以评估两个字符串的相似性

SPACE 返回由重复的空格组成的字符串

STR 返回由数字数据转换来的字符数据

STUFF 删除指定长度的字符并在指定的起始点插入另一组字符

SUBSTRING 求子串函数

UNICODE 按照 Unicode标准的定义,返回输入表达式的第一个字符的整数值

UPPER 返回将小写字符数据转换为大写的字符表达式

3.6 控制流语句

Transact-SQL提供称为控制流的特殊关键字,用于控制 Transact-SQL语句、语句块和

存储过程的执行流。与所有的计算机编程语言一样,Transact-SQL 也提供了用于编写过程

性代码的语法结构,可用来进行顺序、分支、循环、存储过程等程序设计,编写结构化的

Page 22: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·67·

·67·

模块代码,并放置到数据库服务器上。

3.6.1 BEGIN …END 语句

BEGIN…END语句用于将多个 Transact-SQL语句组合为一个程序块。在执行时,该程

序块作为一个整体被执行。

BEGIN…END的语法格式为: BEGIN

< 语句 1 >

...

< 语句 n>

END 任何时候当控制流语句必须执行一个包含两条或两条以上 Transact-SQL语句的语句块

时,都可以使用 BEGIN…END语句。它们必须成对使用,任何一条语句均不能单独使用。

BEGIN…END语句可以嵌套使用。

例如, BEGIN

DECLARE @MyVar float

SET @MyVar = 123.456

BEGIN

PRINT ’变量@MyVar的值为:’

PRINT CAST(@MyVar AS varchar(12 ))

END

END 执行结果为: 变量@MyVar的值为:

123.456 下面几种情况经常要用到 BEGIN…END语句。

WHILE循环需要包含语句块。

CASE函数的元素需要包含语句块。

IF或 ELSE子句需要包含语句块。

注意:在上述情况下,如果只有一条语句,则不需要使用 BEGIN…END语句。

3.6.2 IF…ELSE 语句

使用 IF…ELSE语句,可以有条件地执行语句。

语法格式如下: IF <条件表达式>

< 语句 1>

[ ELSE

< 语句 2 > ] 其中条件表达式的值必须是逻辑值,ELSE 子句是可选的。如果条件表达式中含有

SELECT语句,必须用圆括号将 SELECT语句括起来。

Page 23: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·68·

·68·

IF…ELSE 语句的执行方式是:如果布尔表达式的值为 TRUE,则执行 IF 后面的语句

块;否则执行 ELSE后面的语句块。

例如,检查学生的英语成绩,并返回一条消息 。 IF (SELECT AVG(英语) FROM Test)>70

BEGIN

PRINT ‘课程:英语’

PRINT ‘考试成绩不错,再接再厉’

END

ELSE

BEGIN

PRINT ‘课程:英语’

PRINT ‘考试成绩欠缺,继续努力!’

END 执行结果为: 课程:英语

考试成绩不错,再接再厉! 在 IF…ELSE语句中,IF和 ELSE后面的子句都允许嵌套,嵌套层数不受限制。

注意:如果在 IF…ELSE 语句的 IF 部分和 ELSE 部分都使用了 CREATE TABLE 语句或

SELECT INTO语句,那么 CREATE TABLE语句或 SELECT INTO语句必须指向相

同的表名。 例如,写出下列程序的运行结果。 DECLARE @x int ,@y int ,@z int

SET @x=1 , @y=2 , @z=3

IF @x>@y

PRINT ’x>y’

ELSE IF @y>@z

PRINT ’y>z’

ELSE

PRINT 'z>=y’ 此题的运行结果是: z>=y

3.6.3 CASE 语句

使用 CASE语句可以进行多个分支的选择。

CASE具有以下两种格式。 � 简单 CASE格式将某个表达式与一组简单表达式进行比较,以确定结果。 � 搜索 CASE格式计算一组布尔表达式,以确定结果。

1. 简单 CASE格式

语法格式是: CASE <测试表达式>

WHEN <表达式> THEN <结果表达式 1>

Page 24: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·69·

·69·

[…n]

[ELSE <结果表达式 n>]

END 这种格式的 CASE表达式将一个测试表达式与一组简单表达式进行比较。如果某个简

单表达式的值与测试表达式的值相等,则返回相应结果表达式的值;否则返回 ELSE 结果

表达式 n的值。如果没有 ELSE子句,则返回 NULL。

例如, USE tch001

GO

SELECT tname AS‘姓名’,depart AS‘单位’,

CASE 职称

WHEN ‘教授’ THEN‘高级’

WHEN ‘副教授’ THEN ‘高级’

WHEN ‘讲师’ THEN ‘中级’

WHEN ‘助教’ THEN ‘初级’

END AS ‘职称类别’

FROM teacher

GO 执行结果为: 姓名 单位 职称类别

李佳明 机电工程系 高级

王丽萍 计算机系 初级

刘和平 工程管理系 初级

张强 电子信息系 中级

2.搜索 CASE格式

语法格式是: CASE

WHEN < 布尔表达式 > THEN < 结果表达式 1 >

[…n]

[ELSE < 结果表达式 n>]

END 搜索 CASE格式的执行方式为:当布尔表达式的值为 TRUE,则返回 THEN后面的结

果表达式,然后跳出 CASE语句;否则继续测试下一个WHEN后面的布尔表达式。如果所

有的WHEN后面的布尔表达式均为 FALSE,则返回 ELSE后面的表达式。如果没有 ELSE

子句,则返回 NULL。

例如, USE Rrhnnl

SELECT sno AS ’学号’,cno AS ’课程号’,

CASE

WHEN degree>=90 THEN ’优秀’

WHEN degree>=80 THEN ’良好’

WHEN degree>=70 THEN ’中等’

WHEN degree>=60 THEN ’及格’

WHEN degree<60 THEN ’不及格’

Page 25: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·70·

·70·

END AS ’成绩等级’

FROM score ORDER BY sno

GO 执行结果为: 学号 课程号 成绩等级

101 3—105 及格

10l 6—166 良好

103 3—245 良好

103 3—105 优秀

105 3—245 中等

105 3—105 良好

107 3—105 优秀

107 6—166 中等

108 6-166 良好

108 3—105 不及格

109 3—105 及格

109 3—245 良好

3.6.4 WHILE语句

WHILE语句通过布尔表达式来设置一个条件,当这个条件成立时,重复执行一个语句

或语句块,重复执行的部分称为循环题。可以使用 BREAK和 CONTINUE关键字在循环内

部控制WHILE循环中语句的执行。

语法格式是: WHILE 〈布尔表达式〉

< 语句 1 >

[BREAK]

< 语句 2 >

[CONTINUE]

< 语句 3>

END

其中,<语句>如果由多条 Transact SQL语句组成,则需要用 BEGIN和 END括起来。BREAK

命令的功能是让程序跳出包含它的最内层循环,而 CONTINUE 命令可以让程序跳过

CONTINUE 之后的语句回到 WHILE 循环的第一行命令。通常情况下,CONTINUE 和

BREAK是放在 IF…ELSE命令中的,即在满足某个条件的前提下提前结束本次循环或退出

本层循环。WHILE语句可以嵌套。

例如,计算从 1加到 100的值。 DECLARE @Result int ,@n int

SET @n=0

SET @Result =0

WHILE @n<=100

BEGIN

SET @Result=@Result+@n

SET @n=@n+l

END

PRINT CAST@Result AS char(25))

Page 26: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·71·

·71·

执行结果为: 5050

3.6.5 GOTO语句

GOTO语句可以实现无条件的跳转。

语法格式为: GOTO lable

其中,lable为要跳转到的语句标号。其名称要符合标识符的规定。

GOTO语句的执行方式为:遇到 GOTO语句后,直接跳转到 1able标号处继续执行,

而 GOTO后面的语句将不被执行。

例如,使用以下语句重新计算从 1加到 100的值。 DECLARE @Result int ,@n int

SET @n=0

SET @Result=0

Loop_1: /*定义标号*/

SET @Result=@Result+@n

SET @n=@n+1

IF @n<=100

GOTO loop_1 /*如果小于 100,跳转到 loop_1标号处*/

PRINT CAST@Result AS char(25) 执行结果为: 5050

3.6.6 RETURN语句

使用 RETURN语句,可以从查询或过程中无条件退出。可在任何时候用于从过程、批

处理或语句块中退出,而不执行位于 RETURN之后的语句。

语法格式为:

RETURN [<整形表达式>]

其中,<整形表达式>为一个整数数值,是 RETURN语句要返回的值。

注意:当用于存储过程时,RETURN不能返回空值。如果试图返回空值,将生成警告信息

并返回 0值。

3.6.7 WAITFOR语句

使用 WAITFOR语句,可以在指定的时间或者过了一定时间后,执行语句块、存储过

程或者事务。

语法格式为: WAITFOR <DELAY ‘time’ ︱ TIME ‘time’ >

说明:DELAY指示 SQL Server一直等到指定的时间过去,最长可达 24小时。time为要等

待的时间。可以按 datetime 数据可接受的格式指定 time,也可以用局部变量指定此

Page 27: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·72·

·72·

参数。不能指定日期,因此在 datetime值中不允许有日期部分。TIME指示 SOL Server

等待到指定时间。

例如,下面的 SQL语句指定在 1时 10分时执行一个语句。 BEGIN

WAITFOR TIME ’1:10:00 ’

PRINT ’现在是 1:10:00 ’

END 执行后,等计算机上的时间到了 l时 10分时,出现下面结果:

现在是 1:10:00 例如,在 4秒钟之后打印出‘OK!’字符,使用如下语句。 WAITFOR DELAY ’00:00:04’

PRINT ’OK!’

3.6.8 PRINT语句

该语句将用户定义的消息返回客户端,其格式为:

PRINT 字符串︱局部变量︱函数︱字符串表达式

3.7 上 机 指 导

SQL Server提供了多种图形和命令行工具,SQL Server查询分析器是一个图形用户界

面,用以交互地设计和测试 Transact-SQL语句、批处理和脚本。

目的是学会创建用户定义函数,在 SQL Server查询分析器中声明局部变量、验证各种

函数,运用 Transact-SQL语句编制程序、调试程序和运行程序。

3.7.1 创建用户定义函数

1. 在 SQL Server企业管理器中创建一个用户定义的数据类型

① 打开企业管理器并将服务器展开。

② 选定要创建用户定义类型的数据库,弹出如图 3.10所示的窗口。

图 3.10 用户定义数据类型

Page 28: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·73·

·73·

③ 右击该库中的【用户定义的数据类型】一项,弹出如图 3.11所示的属性窗口。

图 3.11 新建用户定义数据类型窗口

④ 在其中输入数据库类型名、基于哪种系统数据类型、是否为空等信息,即可定义一

种新的数据类型。

⑤ 单击【确定】按钮,关闭对话框。

2. 在 SQL Server查询分析器中创建一个用户定义的数据类型

① 展开企业管理器,选定要创建用户定义数据类型的数据库。

② 选定【工具】菜单,选定【SQL 查询分析器】子菜单,如图 3.12 所示,激活查询

分析器。

图 3.12 激活查询分析器

① 在查询分析器中,使用系统存储过程 sp_addtype创建用户定义数据类型。

② 在查询分析器中输入如下命令并执行,即可创建用户定义数据类型,如图 3.13所示。

在查询分析器中输入的命令为: sp_adtdype @typename=postcode,@phystype='char(20)',

Page 29: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·74·

·74·

@nulltype='not null' 上面创建的数据类型可以在当前数据库定义新表时使用,这时可使用一种名为

postcode 的数据类型,它是一种长度为 20、允许 NUULL的定长字符类型。

图 3.13 用查询分析器创建用户定义类型

3.7.2 在 SQL Server 2000查询分析器中声明局部变量及验证函数

1. 在 SQL Server 查询分析器中为局部变量赋值

例如,声明一个长度为 6 的字符型变量 name1,并赋值“李红梅”,一个整型局部变

量 num1,并赋值 15。 DECLARE @tmp char(6), @num1 int

SET @tmp=’李红梅’

SELECT @num1=15

2. 在 SQL Server 查询分析器中验证函数

例如,ASCII(‘abcd’) 返回 97。 CHAR(65)

返回字符‘A’。 LEFT(‘CHINA BEIJING’,5)

返回‘CHINA’。 STUFF(‘XYZRSETN’ 2,4,’ABC’)

返回‘XABCETN’。 ABS(-25)

返回 25。 SQUARE(2.5)

返回 6.25。 CHAR函数可以把一个整数转换为 ASCII字符。当确定控制字符时(如回车或换行),这

是很有用的。

Page 30: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

第 3章 Transact-SQL语言概述

·75·

·75·

例如,在字符串中用 CHAR(13)和 CHAR(10)产生一个回车并生成一个新行。 PRINT ‘第一行’+CHAR(13)+CHAR(10)+’第二行’

执行结果为: 第一行

第二行

3.7.3 使用 SQL Server 2000查询分析器编制、调试、运行程序

【例 3.1】 编制程序求 2的 1~5次方的值。

语句如下: DECLARE @value int,@counter int

SET @value=2

SET @counter=1

WHILE @counter<=5

BEGIN

SELECT POWER (@value,@counter )

SET NOCOUNT ON

SET @counter=@counter+1

SET NOCOUNT OFF

END

【例 3.2】 求出 1~100的所有素数。

语句如下: DECLARE @n int,@t int

SET @n=1

WHILE @n<=100

BEGIN

SET @t=2

WHILE @t<@n

BEGIN

IF @n%@t=0

BREAK

SET @t=@t+1

END

IF @t>=@n

PRINT @n

SET @n=@n+1

END

习 题

1. 填空题

(1) 在 SQL Server 2000中,变量分为 和 。

(2) 在使用 DECLARE 语句来声明局部变量时,必须 类型。变量名前必

Page 31: 第 3 章 Transact SQL 语言概述 - read.pudn.comread.pudn.com/downloads152/ebook/661195/ch03.pdf第 3章 Transact-SQL语言概述 ·47· · 47· 的名称。可分为常规标识符和分隔标识符。SQL

SQL Server数据库设计与管理

·76·

·76·

须有 ,变量名称的最大长度为 。

(3) SQL Server提供的运算符有 、 、 、 、 、 和 。

(4) 聚合函数在结果集中通过对被选列值的收集处理,并返回一个数值型的计算结果。

聚合函数有 5种: 、 、 、 、 。

(5) SQL Server中的标识符就是指用来定义服务器、数据库、数据库对象和变量的名称,

可分为 和 。

2. 简答题

(1) 什么叫全局变量?什么是局部变量?全局变量和局部变量的区别是什么?

(2) 变量的命名规则是什么?怎样给变量赋值?

(3) 什么是标识符?什么是常规标识符和分隔标识符?

(4) LIKE匹配字符有哪几种?

(5) 怎样通过 SQL Server 企业管理器创建用户定义的数据类型?

3. 操作题

(1) 定义一个局部变量,并赋初值。

(2) 打开企业管理器,练习通过企业管理器创建用户定义数据类型。

(3) 编写程序,比较两个数的大小,输出较大的一个,并在查询分析器中运行。

(4) 编写程序计算 1*2*3*4*5*…10的值,并输出计算结果。