本节书摘来自异步社区出版社《锋利的SQL(第2版)》一书中的第1章,第1.6节,作者:张洪举 王晓文,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.6 运算符
锋利的SQL(第2版)
运算符是一种符号,用来指定要在一个或多个表达式中执行的操作。SQL Server所使用的运算符可以分为算术运算符、赋值运算符、位运算符、比较运算符、逻辑运算符、字符串串联运算符和一元运算符,共7个类别。
1.6.1 算术运算符
算术运算符可以对两个表达式执行数学运算,这两个表达式可以是数值数据类型类别的任何数据类型。可用算术运算符如表1-5所示。
表1-5 算术运算符
加(+)和减(-)运算符也可用于对datetime和smalldatetime型值执行算术运算。
在进行算术运算时,需要注意计算结果的精度、小数位数和数据类型长度的变化。所谓精度,是指数字中的数字个数。小数位数是数中小数点右边的数字个数。例如,数123.45的精度是5,小数位数是2。
numeric和decimal数据类型的默认最大精度为38,而早期的SQL Server版本中,默认的最大精度为28。
数字数据类型的长度是指存储此数所占用的字节数。字符串或Unicode数据类型的长度是字符个数。binary、varbinary和image数据类型的长度是字节数。例如,int数据类型可以有10位数,用4个字节存储,不接受小数点。int数据类型的精度是10,长度是4,小数位数是0。
除了decimal类型之外,数字数据类型的精度和小数位数是固定的。如果算术运算符有两个相同类型的表达式,结果就为该数据类型,并且具有对此类型定义的精度和小数位数。如果运算符有两个不同数字数据类型的表达式,则由数据类型优先级决定结果的数据类型。
表1-6列出了当运算结果是decimal类型时,如何计算结果的精度和小数位数。只有当下列任一条件成立时,结果才为decimal数据类型。
两个表达式都是decimal类型。
一个表达式是decimal类型,而另一个是比decimal优先级低的数据类型。
操作数表达式由表达式e1(精度为p1,小数位数为s1)和表达式e2(精度为p2,小数位数为s2)来表示。非decimal类型的任何表达式的精度和小数位数,采用该表达式的当前设置。
注意
结果精度和小数位数的绝对最大值为38。当结果精度大于38时,相应的小数位数会减少,以避免结果的整数部分被截断。
1.6.2 赋值运算符
等号(=)是唯一的赋值运算符。它通常与SET语句一起使用,为变量赋值。例如,下面将创建一个@MyCounter变量,然后使用赋值运算符为其赋值。
DECLARE @MyCounter INT
SET @MyCounter = 1
也可以使用赋值运算符在列标题和定义列值的表达式之间建立关系。下面的语句将显示列标题FirstColumnHeading和SecondColumnHeading。在所有行的FirstColumnHeading列中均显示字符串“xyz”。然后,在SecondColumnHeading列中列出来自Product表的每个产品ID。
USE AdventureWorks
GO
SELECT FirstColumnHeading = 'xyz',
SecondColumnHeading = ProductID
FROM Production.Product;
GO
1.6.3 位运算符
位运算符在两个表达式之间执行按位运算,这两个表达式可以是整数数据类型类别中的任何数据类型。可用的位运算符如表1-7所示。
位运算符的操作数可以是整数或二进制字符串数据类型类别中的任何数据类型(image数据类型除外),但两个操作数不能同时是二进制字符串数据类型类别中的某种数据类型。表1-8列出了所支持的操作数数据类型。
对于按位进行与运算、或运算和异或运算的计算规则如表1-9所示。
1.6.4 比较运算符
比较运算符测试两个表达式是否相同。除了text、ntext或image数据类型的表达式外,比较运算符可以用于所有的表达式。表1-10列出了可用的比较运算符。
使用比较运算符的表达式的计算结果为布尔数据类型,它有3种值:TRUE、FALSE和UNKNOWN。与其他SQL Server数据类型不同,布尔数据类型不能被指定为表列或变量的数据类型,也不能在结果集中返回。
1.6.5 逻辑运算符
逻辑运算符对某些条件进行测试,以获得其真实情况。逻辑运算符和比较运算符一样,返回带有TRUE或FALSE值的布尔数据类型。表1-11列出了可用的逻辑运算符。
1.6.6 字符串串联运算符
加号(+)是字符串串联运算符,可以用它将字符串串联起来。其他所有字符串操作都使用字符串函数(如SUBSTRING)进行处理。
例如,下面使用加号将“abc”和“efg”串联起来,得到的结果是“abcefg”。
'abc'+'efg'
在进行字符传串联时,需要注意字符串长度的变化。
在将两个char、varchar、binary或varbinary表达式串联时,所生成表达式的长度是两个源表达式长度之和,或是8000字符,以二者中少者计算。
在将两个nchar或nvarchar表达式串联时,所生成表达式的长度是两个源表达式长度之和,或是4000字符,以二者中少者计算。
1.6.7 一元运算符
一元运算符只对一个表达式执行操作,该表达式可以是数字数据类型类别中的任何一种数据类型。表1-12列出了可用的一元运算符。
+和-运算符可以用于数字数据类型类别中任意一数据类型的任意表达式。~运算符只能用于整数数据类型类别中任意一数据类型的表达式。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。