3.7.5 运算符及表达式
运算符是一种符号,用来指定要在一个或多个表达式中指定的操作。Transact-SQL中提供了多种运算符,如:算术运算符、赋值运算符、字符串串联运算符、比较运算符、逻辑运算符、位运算符和一元运算符等。
(1)算术运算符
算术运算符用来在两个表达式上执行数学运算,这两个表达式可以是任意数值数据类型。算术运算符包括:加(+)、减(-)、乘(*)、除(/)、取模(%)。
取模运算返回两数相除后的余数,例如:38%5=3。
此外,加(+)和减(-)也可用于对datetime和smalldatetime值进行算术运算。例如:GETDATE()+10,运行结果为系统当前日期时间值加10,注意:此时的“10”对应天数。
(2)赋值运算符
Transact-SQL只有一个赋值运算符,即等号“=”。
【例3.81】 下面的代码首先声明了局部变量@MyCount,然后使用赋值运算符为局部变量@MyCount赋值。
(3)字符串串联运算符
字符串串联运算符为“+”,可以将两个或多个字符串合并为一个字符串,还可以连接二进制字符串。
例如:hello++china!的结果为:hello china!。
(4)比较运算符
比较运算符用来测试两个表达式是否相同。除text、ntext或image数据类型的表达式外,比较运算符可以用于所有其他表达式。比较运算符的符号及其含义见表3-14。
表3-14 比较运算符的符号及其含义
比较运算符的结果是布尔数据类型,它有三个值:TRUE、FALSE和UNKNOWN。比较两个空值或将空值与其他任何值进行比较均返回UNKNOWN,这是因为每个空值都是未知的。当SET ANSI_NULLS为ON时,带有一个或两个NULL表达式的运算符返回UNKNOWN;当SET ANSI_NULLS为OFF时,这些运算符将NULL视为已知值,且只返回TRUE或FALSE(不会返回UNKNOWN)。注意:与其他SQL Server数据类型不同,布尔数据类型不能被指定为表、列或变量的数据类型,也不能在结果集中返回。
(5)逻辑运算符
逻辑运算符用来对某些条件进行测试,以获得其真实情况。逻辑运算符和比较运算符一样,返回带有TRUE、FALSE和UNKNOWN值的布尔数据类型。逻辑运算符的符号及其含义见表3-15。
表3-15 逻辑运算符的符号及其含义
续表
(6)位运算符
位运算符在两个表达式之间执行位操作,这两个表达式可以为整数数据类型类别中的任何数据类型。常用的位运算符的符号及其含义见表3-16。
表3-16 位运算符的符号及其含义
(7)一元运算符
一元运算符只对一个表达式执行操作。正(+)和负(-)运算符可以用于数字数据类型中的任一数据类型的任意表达式,~(位非)运算符只能用于整数数据类型类别中任一数据类型的表达式。一元运算符的符号及其含义见表3-17。
表3-17 一元运算符的符号及其含义
(8)运算符的优先级
当一个复杂的表达式有多个运算符时,运算符优先级将决定执行运算的先后次序,执行顺序可能对结果值有明显的影响。可以使用括号改变表达式中运算符的优先级。
Transact-SQL中运算符的优先级别见表3-18。
表3-18 SQL Server运算符的优先级
当一个表达式中的两个运算符有相同的运算符优先级别时,将按照它们在表达式中的位置对其从左到右进行求值。如果无法确定优先级,可以使用圆括号“()”来改变优先级。
(9)表达式
表达式是符号和运算符的组合,该组合将返回单个数据值。简单表达式可以是一个常量、变量或标量函数,也可以用运算符将两个或更多的简单表达式连接起来组成复杂表达式。简单表达式的数据类型取决于它所引用的元素(常量、变量或标量函数)的数据类型,而复杂表达式的数据类型由进行组合的表达式决定,表达式中元素组合的顺序由表达式中运算符的优先级决定。
根据连接表达式的运算符进行分类,可以将表达式分为算术表达式、比较表达式、逻辑表达式、字符串表达式等。例如:GETDATE()-10是一个算术表达式,hello+china是一个字符串表达式,YEAR(GETDATE())-YEAR(Sbirthday)<20 AND Ssex=女则是一个逻辑表达式。