好记性不如烂笔头。

SQL 中的运算符

运算符

运算符是一种符号,用来指定要在一个或多个表达式中执行的操作。Microsoft® SQL Server™ 2000 使用下列几类运算符:

  • 算术运算符

  • 赋值运算符

  • 位运算符

  • 比较运算符

  • 逻辑运算符

  • 字符串串联运算符

  • 一元运算符
算术运算符

算术运算符在两个表达式上执行数学运算,这两个表达式可以是数字数据类型分类的任何数据类型。有关数据类型分类的更多信息,请参见 Transact-SQL 语法规则

运算符含义
+(加) 加法。
-(减) 减法。
*(乘) 乘法。
/(除) 除法。
%(模) 返回一个除法的整数余数。例如,12 % 5 = 2,这是因为 12 除以 5,余数为 2。

 

加 (+) 和减 (–) 运算符也可用于对 datetimesmalldatetime 值执行算术运算。

有关算术运算结果的精度和小数位数的更多信息,请参见精度、小数位数及长度

赋值运算符

Transact-SQL 有一个赋值运算符,即等号 (=)。在下面的示例中,创建了 @MyCounter 变量。然后,赋值运算符将 @MyCounter 设置成一个由表达式返回的值。

DECLARE @MyCounter INT
SET @MyCounter = 1

也可以使用赋值运算符在列标题和为列定义值的表达式之间建立关系。下面的示例显示名为 FirstColumnHeading SecondColumnHeading 的两个列标题。在 FirstColumnHeading 列标题中为所有的行都显示字符串 xyz。然后,在 SecondColumnHeading 列标题中列出来自 Products 表的每个产品 ID。

USE Northwind
GO
SELECT FirstColumnHeading = 'xyz',
       SecondColumnHeading = ProductID
FROM Products
GO
按位运算符

位运算符在两个表达式之间执行位操作,这两个表达式可以为整型数据类型分类中的任何数据类型。

运算符含义
&(按位 AND) 按位 AND(两个操作数)。
|(按位 OR) 按位 OR(两个操作数)。
^(按位互斥 OR) 按位互斥 OR(两个操作数)。

 

位运算符的操作数可以是整型或二进制字符串数据类型分类中的任何数据类型(但 image 数据类型除外),此外,两个操作数不能同时是二进制字符串数据类型分类中的某种数据类型。下表显示所支持的操作数数据类型。

左边操作数右边操作数
binary intsmallint tinyint
bit intsmallinttinyint bit
int intsmallinttinyintbinary varbinary
smallint intsmallinttinyintbinary varbinary
tinyint intsmallinttinyintbinary varbinary
varbinary intsmallint tinyint

 

比较运算符

比较运算符测试两个表达式是否相同。除了 textntextimage 数据类型的表达式外,比较运算符可以用于所有的表达式。

运算符含义
=(等于) 等于
>(大于) 大于
<(小于) 小于
>=(大于或等于) 大于等于
<=(小于或等于) 小于等于
<>(不等于) 不等于
!=(不等于) 不等于(非 SQL-92 标准)
!< (不小于) 不小于(非 SQL-92 标准)
!> (不大于) 不大于(非 SQL-92 标准)

 

比较运算符的结果有布尔数据类型,它有三种值:TRUE、FALSE 及 UNKNOWN。那些返回布尔数据类型的表达式被称为布尔表达式。

和其它 SQL Server 数据类型不同,不能将布尔数据类型指定为表列或变量的数据类型,也不能在结果集中返回布尔数据类型。

当 SET ANSI_NULLS 为 ON 时,带有一个或两个 NULL 表达式的运算符返回 UNKNOWN。当 SET ANSI_NULLS 为 OFF 时,上述规则同样适用,只不过如果两个表达式都为 NULL,那么等号运算符返回 TRUE。例如,如果 SET ANSI_NULLS 是 OFF,那么 NULL = NULL 就返回 TRUE。

在 WHERE 子句中使用带有布尔数据类型的表达式,可以筛选出符合搜索条件的行,也可以在流控制语言语句(例如 IF 和 WHILE)中使用这种表达式。例如:

USE Northwind
GO
DECLARE @MyProduct int
SET @MyProduct = 10
IF (@MyProduct <> 0)
   SELECT *
   FROM Products
   WHERE ProductID = @MyProduct
GO
逻辑运算符

逻辑运算符对某个条件进行测试,以获得其真实情况。逻辑运算符和比较运算符一样,返回带有 TRUE 或 FALSE 值的布尔数据类型。

运算符含义
ALL 如果一系列的比较都为 TRUE,那么就为 TRUE。
AND 如果两个布尔表达式都为 TRUE,那么就为 TRUE。
ANY 如果一系列的比较中任何一个为 TRUE,那么就为 TRUE。
BETWEEN 如果操作数在某个范围之内,那么就为 TRUE。
EXISTS 如果子查询包含一些行,那么就为 TRUE。
IN 如果操作数等于表达式列表中的一个,那么就为 TRUE。
LIKE 如果操作数与一种模式相匹配,那么就为 TRUE。
NOT 对任何其它布尔运算符的值取反。
OR 如果两个布尔表达式中的一个为 TRUE,那么就为 TRUE。
SOME 如果在一系列比较中,有些为 TRUE,那么就为 TRUE。

 

有关逻辑运算符的更多信息,请参见专门的逻辑运算符主题。

字符串串联运算符

字符串串联运算符允许通过加号 (+) 进行字符串串联,这个加号也被称为字符串串联运算符。其它所有的字符串操作都可以通过字符串函数(例如 SUBSTRING)进行处理。

默认情况下,对于 varchar 数据类型的数据,在 INSERT 或赋值语句中,将空的字符串解释为空字符串。在串联 varcharchartext 数据类型的数据时,空的字符串被解释为空字符串。例如,将 'abc' + '' + 'def' 存储为 'abcdef'。但是,如果 sp_dbcmptlevel 兼容性级别设置为 65,那么将空的常量当作一个空格字符,这样就将 'abc' + '' + 'def' 存储为 'abc def'。有关空字符串的解释的更多信息,请参见 sp_dbcmptlevel

当两字符串串联时,根据排序规则的优先规则设置结果表达式的排序规则。有关更多信息,请参见排序规则的优先顺序

一元运算符

一元运算符只对一个表达式执行操作,这个表达式可以是数字数据类型分类中的任何一种数据类型。

运算符含义
+ (正) 数值为正。
- (负) 数值为负。
~(按位 NOT) 返回数字的补数。

 

+ (正)和 - (负)运算符可以用于数字数据类型分类的任何数据类型的表达式。~ (按位 NOT)运算符只可以用于整型数据类型分类的任何数据类型的表达式。

运算符的优先顺序

当一个复杂的表达式有多个运算符时,运算符优先性决定执行运算的先后次序。执行的顺序可能严重地影响所得到的值。

运算符有下面这些优先等级。在较低等级的运算符之前先对较高等级的运算符进行求值。

  • +(正)、-(负)、~(按位 NOT)

  • *(乘)、/(除)、%(模)

  • +(加)、(+ 串联)、-(减)

  • =,  >,  <,  >=,  <=,  <>,  !=,  !>,  !< 比较运算符

  • ^(位异或)、&(位与)、|(位或)

  • NOT

  • AND

  • ALL、ANY、BETWEEN、IN、LIKE、OR、SOME

  • =(赋值)

当一个表达式中的两个运算符有相同的运算符优先等级时,基于它们在表达式中的位置来对其从左到右进行求值。例如,在下面的示例中,在 SET 语句中使用的表达式中,在加号运算符之前先对减号运算符进行求值。

DECLARE @MyNumber int
SET @MyNumber = 4 - 2 + 27
-- Evaluates to 2 + 27 which yields an expression result of 29.
SELECT @MyNumber

在表达式中可以使用括号替代所定义的运算符的优先性。首先对括号中的内容进行求值,从而产生一个值,然后括号外的运算符才可以使用这个值。

例如在下面的示例中,在 SET 语句所使用的表达式中,乘运算符比加运算符有更高的优先权,所以先对乘运算符进行求值;表达式的结果是 13。

DECLARE @MyNumber int
SET @MyNumber = 2 * 4 + 5
-- Evaluates to 8 + 5 which yields an expression result of 13.
SELECT @MyNumber

在下面的示例中,在 SET 语句使用的表达式中,括号使得首先执行加法;表达式结果是 18。

DECLARE @MyNumber int
SET @MyNumber = 2 * (4 + 5)
-- Evaluates to 2 * 9 which yields an expression result of 18.
SELECT @MyNumber

如果表达式有嵌套的括号,那么首先对嵌套最深的表达式求值。下面的示例中包含嵌套的括号,其中表达式 5 - 3 在嵌套最深的那对括号中。该表达式产生一个值 2。然后加运算符将这个结果与 4 相加,这样就得出一个为 6 的值。最后将 6 与 2 相乘,产生一个表达式结果 12。

DECLARE @MyNumber int
SET @MyNumber = 2 * (4 + (5 - 3) )
-- Evaluates to 2 * (4 + 2) which further evaluates to 2 * 6, and 
-- yields an expression result of 12.
SELECT @MyNumber