2.5 常量、变量、函数和表达式
在数据库业务数据处理过程中,经常用到标识符、常量、变量、函数和表达式的概念及使用方法,也常用上述语句构成复杂的函数、触发器和存储过程。
2.5.1 标识符及使用规则
标识符(Identifer)是指用于标识数据库对象名称的字符串,如服务器、数据库、表、视图、索引、触发器和存储过程等。操作数据库对象时需要标识符,如查询指定表的数据必须指定查询表的表名,但也有一些对象是可选的标识符,如创建约束时的标识符可由系统默认生成。按照其用法标识符分为两类:常规标识符和界定标识符。
1.常规标识符
常规标识符(Regular identifer)又称规则标识符,其命名规则如下。
1)标识符由字母、数字、下画线、@符号、#和$符号组成,其中字母可以是大小写英文字母或其他语言的字符,如表名:“商品信息A_1”。
知识拓展
@和#标识符及其用法
2)标识符的首字符不能是数字或$符号。
3)标识符不允许使用SQL保留字,如命令sp_help或函数名max、desc、asc等。
4)标识符内不允许有空格或特殊字符,如?、%、&、∗等。
5)标识符的长度不能超过128个字符。
2.界定标识符
界定标识符又称分隔标识符,包括以下两种。
1)方括号或引号。对不符合标识符命名规则的标识符,例如,标识符中包含SQL Server关键字或包含内嵌的空格和其他不是规则规定的字符时,要使用界定标识符方括号([])或双引号("")将标识符括起来。
2)空格和保留字。例如,在标识符[product name]和"insert"中,分别将界定标识符用于带有空格和保留字insert的标识符中。
说明:
1)符合标识符格式的可用标识符可以分隔,也可不分隔。对于不符合格式规则的标识符必须进行分隔。例如,对于标识符product Type Name必须进行分隔,分隔后的标识符为[product Type Name]或"product Type Name"。
知识拓展
Quoted_Identifier开关的作用
2)有两种情况需要使用分隔标识符,即对象名称中包含SQL Sever保留关键时需要使用界定标识符,如[select];对象名称中使用了未列入限定字符的字符,如[prodoct[1]table]。
3)引用标识符。默认情况下,只能使用括号作为界定标识符。如果使用引用标识符,需要将Quoted_Identifier标志设为ON。
【案例2-23】常规标识符应用示例。规范的常规标识符示例:_Product、Company、课程数据表、Customer_01、Product_Type_Name;而不规范的常规标识符示例:tbl product、productName&123。
2.5.2 常用的数据类型
在SQL Server中,常用操作需要指定列、常量、变量、表达式和参数等对象的数据类型,指定对象的数据类型相当于定义该对象的下列特性。
1)对象所含的数据类型,如字符型、整数型、货币型。
2)每列所存储的数据项(字段)值的长度(宽度)或大小。
3)数值精度、小数位数(仅用于数值数据类型)。
SQL Server提供的系统数据类型如表2-23所示,详见数据类型手册。
表2-23 SQL Server系统数据类型
2.5.3 常量和变量及其用法
1.常量的表示及用法
常量是指在程序运行过程中其值保持不变的量。常量是表示一个特定数据值的符号,也称为文字值或标量值。其格式取决于它所表示的值的数据类型,具体数据类型如表2-23所示。
根据不同的数据类型,常量可分为字符型常量、整型常量、日期时间常量、实型常量、货币常量和全局唯一标识符。
(1)字符型常量
字符型常量由字母(a~z,A~Z)、数字字符(0~9)和特殊字符(!、@和#等)组成,通常放在单引号内。如果字符型常量中包含单引号字符,需要使用两个单引号表示,例如,定义一个字符型常量I'm a student,应写成'I"m a student'。
字符型常量有两种:ASCII和Unicode。
1)ASCII字符型常量:由ASCII字符构成的字符串,应放在单引号内,如'abcd'。
2)Unicode字符型常量:在常量前面加一个N,如N'abcd'(其中N必须大写,在SQL92标准中表示国际语言)。
知识拓展
Unicode字符型常量的用法
(2)整型常量
整型常量通常表示整数。主要包括二进制整数、十进制整数和十六进制整数。例如,二进制1100,十六进制0x4b等。
(3)日期时间型常量
日期时间型常量用于表示日期或时间,常用单引号将所表示的日期或时间括在其中。例如,'2019-08-09" July-10-1998"08/24/1998'和'2020年8月9日'等。
(4)实型常量
实型常量用于表示定点数或浮点数,如126.35、5E10。
(5)货币常量
以货币符号开头,如¥600.45。SQL Server不强制分组,每隔3个数字由一个逗号分隔。
(6)全局唯一标识符
全局唯一标识符(Globally Unique Identification Numbers,GUID)是一个128位的二进制数(16字节),用于所有需要唯一标识的计算机和网址。
2.变量的表示及用法
变量是指在程序运行过程中其值可以发生变化的量,包括局部变量和全局变量两种。
(1)局部变量
局部变量是由用户定义,其作用域局限在一定范围内的SQL对象。
作用域:若局部变量在一个批处理、存储过程或触发器中被定义,则其作用域就是此批处理、存储过程和触发器。
局部变量的声明:局部变量的声明语句格式如下。
declare@变量名1[AS]数据类型,@变量名2[AS]数据类型,…,@变量名n[AS]数据类型
注意:
①局部变量名必须以@开头。
②局部变量必须先定义,然后才能在SQL语句中使用,默认值为NULL。
③数据类型要求为系统提供的类型、用户定义的数据类型或别名数据类型。变量不能是text、ntext或image数据类型。
局部变量的赋值。局部变量的赋值语句的语法如下。
格式一:set@变量名=表达式
格式二:set@变量名=表达式
或,select@变量名=输出值from表where条件
或,select@变量名1=表达式1[,@变量名2=表达式2,…,@变量n=表达式n]
知识拓展
变量命名和set变量赋值
【案例2-24】利用select命令为变量@bookName赋值,并通过此命令使变量输出结果(实际的具体书名)。
执行结果如图2-4所示。
【案例2-25】利用select命令查询变量返回多个结果,并将最后一个结果值赋给变量。
执行结果如图2-5所示。
图2-4 【案例2-24】执行结果
图2-5 【案例2-25】执行结果
【案例2-26】利用set语句给局部变量赋值的实际用法。
use Library
go
declare@no varchar(18)
set@no='WC13201'
declare@bookName varchar(64)
select@bookName=书名
from books
where馆藏号=@no
select@bookName as'书名'
执行结果如图2-6所示。
图2-6 【案例2-26】执行结果
(2)全局变量
全局变量是SQL Sever系统定义并提供信息的变量。用于检测服务器及系统的运行情况,用户不能定义全局变量,也不能使用set语句对全局变量进行赋值。
定义全局变量的格式如下。
@@变量名
SQL Server系统提供33个全局变量,方便用户掌握SQL Server服务器的运行情况。常用的全局变量如表2-24所示,更多内容可查阅SQL Server手册。
表2-24 常用的系统全局变量
2.5.4 常用函数及其用法
函数是指具有完成某种特定功能的程序,在SQL编程中也可理解为具有一定功能的SQL语句集合,其处理结果称为返回值,处理过程称为函数体。
SQL Server提供了丰富的内置函数,且允许用户自定义函数。利用这些函数可以方便地实现各种运算和操作,常用select查看函数的返回值(结果)。
1.SQL Server常用函数的用法
SQL Server提供的常用内置函数分为14类。每种类型的内置函数都可以完成某种类型的操作,其内置函数的分类如表2-25所示。
表2-25 SQL Server的内置函数种类及功能
(1)聚合函数及其用法
聚合函数又称为统计函数。所有聚合函数均为确定性函数,只要使用一组特定输入值(数值型)调用聚合函数,该函数就会返回同类型的值。
SQL Server提供了大量聚合函数,聚合函数的名称和功能见表2-26。
表2-26 常用的聚合函数及功能
(续)
注意:在所有聚合函数中,除了COUNT函数以外,聚合函数均忽略空值。
【案例2-27】查询图书表中价格最高的图书。请看一个常用的聚合函数的应用实例,注意其具体用法。
use Library
go
select∗from books
where单价=(select max(单价)from books)
执行结果如图2-7所示。
图2-7 【案例2-27】执行结果
(2)数学函数及其用法
数学函数用于对数字表达式进行数学运算并返回计算结果。SQL Server提供了20多个数学函数。常用的数学函数及功能如表2-27所示。
表2-27 常用的数学函数及功能
以下为几个常见数学函数的应用示例。
select abs(-1) 输出:1
select ceiling(123.1) 输出:124
select floor(123.9999) 输出:123
select pi() 输出:3.14159265358979
select power(2,10) 输出:1024
(3)字符函数及其用法
字符函数也称为字符串函数,用于字符型数据的运算、格式化和处理字符型变量,或将对象转换为字符型。SQL Server提供的常用的字符型函数及功能如表2-28所示。
表2-28 常用的字符型函数及功能
由于字符函数在实际编程中应用较为广泛,下面就表2-28中的每个函数给出相应的示例,示例如表2-29所示。
表2-29 常用的字符函数应用示例
(续)
(4)日期时间函数及其用法
SQL Server提供了9个日期时间处理函数。其中,一些日期时间函数常量及其含义如表2-30所示。
表2-30 常用的日期时间常量及含义
SQL Server提供的9个常用日期时间函数及功能如表2-31所示。
表2-31 常用日期时间函数及功能
【案例2-28】常用的日期时间函数实际应用格式和方法。请看几个表2-31中常用的日期时间函数的应用实例,注意其具体用法。
1)DATEADD函数示例,该函数参数中第1个参数是增加时间类型,包括天、月、年等,第2个参数是增加数量,第3个参数为要增加的日期,返回值为增加日期后的时间。
select getdate()as'当前日期'
select dateadd(day,1,getdate())as'当前日期加1天'
select dateadd(month,1,getdate())as'当前日期加1月'
select dateadd(year,1,getdate())as'当前日期加1年'
2)DATEDIFF函数示例。
declare@end datetime
declare@start datetime
set@end=getdate()
set@start=dateadd(year,-2,@end)
select@start as'开始时间'
select@end as'结束时间'
select datediff(year,@start,@end)'结束时间与开始时间的差'
3)DATENAME函数示例。
select getdate()as'当前日期'
select datename(dw,getdate())as'当天星期几'
select datename(day,getdate())as'当月第几天'
select datename(month,getdate())as'当年第几月'
select datename(year,getdate())as'当前年'
∗2.自定义函数
SQL Server为了扩展性和方便用户,提供了自定义函数,其返回值是一个临时表或数值。自定义函数不支持输出参数(可用存储过程)。根据函数返回值形式的不同可创建三类自定义函数。
(1)标量值自定义函数
标量值自定义函数的返回值是一个确定类型的标量值,其返回值类型为除text、ntext、im-age、timestamp和table类型之外的任意类型,即标量值自定义函数返回的是一个数值。
定义标量值自定义函数的语法结构如下。
说明:
WITH子句指出了创建函数的选项。如果ENCRYPTION参数被指定,则创建的函数是被加密的,函数定义的文本将以不可读的形式存储在syscomments表中,任何人都不可查看该函数的定义,包括函数的创建者和管理员。
【案例2-29】在Libaray示例数据库中创建函数,根据读者卡号,查询该用户的借书数。
函数定义如下:
创建函数后执行以下语句:
use Library
go
select dbo.getBorrowBookCount('2008213124')as'借书数量'
执行结果如图2-8所示。
图2-8 【案例2-29】执行结果
(2)内联表值自定义函数
内联表值自定义函数是以表形式返回一个值(表的数据)。内联表值自定义函数没有BEGIN…END语句中包含的函数体,而是直接用RETURNS子句,其中包含SELECT语句将数据从数据库中筛选形成表。使用内联表值自定义函数可提供参数化的视图功能。
内联表值自定义函数的语法结构如下。
CREATE FUNCTION函数名称(@参数1类型1,[@参数2类型2,…,@参数n类型n])
RETURNS TABLE
[WITH ENCRYPTION]
[AS]
RETURN(查询语句)
【案例2-30】在Libaray示例数据库中,创建函数根据读者卡号,查询该用户所借的所有图书。
执行语句:select∗from getBorrowBookList('2008213124')
执行结果如图2-9所示。
图2-9 【案例2-30】执行结果
(3)多语句表值自定义函数
多语句表值自定义函数可看作标量值和内联表值自定义函数的结合体。此类函数的返回值是一个表,但与标量值自定义函数一样,有一个有BEGIN…END语句块中包含的函数体,返回值表中的数据是由函数体中的语句插入的。因此,其可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表自定义函数的不足。
2.5.5 常用运算符及其用法
运算符是指具体的运算符号,用于执行算术运算、字符串连接、赋值或在字段、常量和变量之间进行比较。运算符主要有六大类:算术运算符、赋值运算符、比较运算符、逻辑运算符、连接运算符和按位运算符。运算符在表达式中连接常量、变量和函数,需注意连接过程中的优先级。
1.运算符的种类
1)算术运算符。可以在两个表达式上执行数学运算,这两个表达式可以是任何数值数据类型。SQL Server中主要的算术运算符如表2-32所示。
2)比较运算符。用于比较两个同类表达式的大小,表达式可以是字符、数字或日期型数据,其比较结果是Boolean值。SQL Server中主要的比较运算符见表2-33。
表2-32 算术运算符
表2-33 比较运算符
3)逻辑运算符。可将多个逻辑表达式连接运算,返回TRUE、FALSE或UNKNOWN的Boolean数据类型值。SQL Server中主要的逻辑运算符如表2-34所示。
表2-34 主要的逻辑运算符
4)连接运算符。连接(+)是字符串串联运算符,可以将多个字符串连接,合并成一个新字符串。
5)按位运算符。按位运算符在两个表达式之间执行位操作,其中的两个表达式可以是整数数据类型中的任何数据类型。SQL Server中主要的逻辑运算符如表2-35所示。
此外,还有赋值运算符(=)和一元运算符(+(正)、-(负)、~(位非))。
2.运算符的优先级
运算符的优先级用于确定运算符与变量、常量、函数的运算顺序,其优先级从高到低如表2-36所示,若两个运算符优先级相同,则按照从左到右的顺序进行运算。
表2-35 按位运算符
表2-36 运算的优先级
2.5.6 常用表达式及其用法
表达式是指由常量、变量或函数等利用运算符按规则连接的式子。常用于“列”或“变量”运算。表达式分为4类:数学表达式、字符串表达式、比较表达式和逻辑表达式。
1.数学表达式
数学表达式用于各种数字变量的运算。常用的数据类型有int、smallint、tinyint、float、real、money和smallmoney。用于数学表达式的符号主要是算术运算符(见表2-32)。
知识拓展
运算符常用的优先级
2.字符串表达式
字符串表达式由字母、符号或数字组成。常用“+”实现字符或字符串的连接。在数据类型中,常用的数据类型有char、varchar、nvarchar、text及可以转换为char或varchar的数据类型。例如,在查询中执行以下代码,则变量str值为“Jsp&Oracle”。
【案例2-31】3个字符串连接的实际应用。
declare@str as varchar(128)
set@str='JSP'+'&'+'Oracle'
select@stras'字符串连接'执行结果如图2-10所示。
图2-10 【案例2-10】执行结果
3.比较表达式
比较表达式用于两个表达式的比较,常用比较表达式运算符见表2-33。需要指出的是,比较表达式的运算优先级和数学表达式一样,并可使用“()”。
知识拓展
数学表达式适用的数据类型
4.逻辑表达式
逻辑表达式有3种连接符:AND、OR、NOT。
1)AND表达式。当所有子表达式的值为“真”时,其逻辑表达式的值(结果)才为“真”,否则表达式的值为“假”。
2)OR表达式。只要有一个子表达式的返回值为“真”,其逻辑运算值即为“真”。
3)NOT表达式。表达式的值为“真”并进行NOT运算后,其表达式的值为“假”,反之亦然。
表达式运算的优先级按照运算符的优先级,从高到低依次为NOT、AND、OR。逻辑表达式常用的数值型数据类型为:binary、varbinary、int smallint、tinyint、bit等,也可用于多个逻辑表达式的运算,只需要各个表达式的结果为TRUE或FALSE。
比较运算符或逻辑运算符组合成的多个表达式,其结果的数据类型为Boolean,且值只能是三种情况之一:TRUE、FALSE或UNKNOWN。
讨论思考:
1)标识符有哪几种?其命名和使用规则分别是什么?
2)什么是常量?什么是变量?它们之间的区别是什么?它们的种类有哪些?
3)什么是函数?常用函数分为哪几类?其功能分别是什么?
4)SQL Server提供哪些种类的运算符?其优先级如何排列?