5.3 常见运算符介绍
运算符连接表达式中的各个操作数,用来指明对操作数所进行的运算。常见的运算有数学运算、比较运算、位运算或者逻辑运算。利用运算符可以更加灵活地使用表中的数据。常见的运算符类型有算术运算符、比较运算符、逻辑运算符和位运算符。本节将介绍各种操作符的特点和使用方法。
5.3.1 运算符概述
运算符是告诉PostgreSQL执行特定算术或逻辑操作的符号。PostgreSQL的内部运算符很丰富,主要有四大类,分别是算术运算符、比较运算符、逻辑运算符、位操作运算符。
1. 算术运算符
用于各类数值运算,包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)。
2. 比较运算符
比较运算符用于比较运算,包括大于(>)、小于(<)、等于(=)、大于等于(>=)、小于等于(<=)、不等于(!=)以及IN、BETWEEN AND、GREATEST、LEAST、LIKE等。
3. 逻辑运算符
逻辑运算符的求值所得结果均为t(TRUE)、f(FALSE)。这类运算符有逻辑非(NOT)、逻辑与(AND)、逻辑或(OR)。
4. 位操作运算符
参与位操作运算的操作数,按二进制位进行运算。位操作运算符包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)6种。
接下来将对PostgreSQL中各种运算符的使用进行详细的介绍。
5.3.2 算术运算符
算术运算符是SQL中最基本的运算符。PostgreSQL中的算术运算符如表5.6所示。
表5.6 PostgreSQL中的算术运算符
下面分别讨论不同算术运算符的使用方法。
【例5.16】创建表tmp14,定义数据类型为INT的字段num,插入值64,对num值进行算术运算:
创建表tmp14,输入语句如下:
CREATE TABLE tmp14 ( num INT);
向字段num插入数据64:
INSERT INTO tmp14 VALUES (64);
对num值进行加法和减法运算:
SELECT num, num+10, num-10, num+5-3, num+36.5 FROM tmp14;
语句执行后,结果如图5-16所示。
由计算结果可以看到,可以对num字段的值进行加法和减法的运算,而且由于‘+’和‘-’的优先级相同,因此先加后减或者先减后加之后的结果是相同的。
图5-16 SQL语句执行结果
【例5.17】对tmp14表中的num进行乘法、除法运算。
SELECT num, num *2, num /2, num/3, num%3 FROM tmp14;
语句执行后,结果如图5-17所示。
图5-17 SQL语句执行结果
由计算结果可以看到,对num进行除法运算时,由于64无法被3整除,因此PostgreSQL对num/3求商的结果保留到了小数点后面四位,结果为21.3333;64除以3的余数为1,因此取余运算num%3的结果为1。
在数学运算时,除数为0的除法是没有意义的,因此除法运算中的除数不能为0,如果被0除,就会弹出错误警告。
【例5.18】用0除num。
SELECT num, num / 0, num %0 FROM tmp14;
语句执行后,结果如图5-18所示。由于存在错误,【数据输出】窗口中并没有显示出相应的结果,在【消息】窗口显示错误信息。
图5-18 SQL语句执行结果
5.3.3 比较运算符
一个比较运算符的结果总是t、f或者是空值,比较运算符经常在SELECT的查询条件子句中使用,用来查询满足指定条件的记录。PostgreSQL中的比较运算符如表5.7所示。
表5.7 PostgreSQL中的比较运算符
下面分别讨论不同比较运算符的使用方法。
1. 等于运算符(=)
等于“=”用来判断数字、字符串和表达式是否相等。如果相等,返回值为1,否则返回0。
【例5.19】使用“=”进行相等判断,SQL语句如下:
SELECT 1=0, '2'=2, 2=2,'b'='b', (1+3) = (2+1),NULL=NULL;
语句执行后,结果如图5-19所示。
由结果可以看到,在进行判断时2=2和‘2’=2的返回值相同,都为true,因为在进行判断时,PostgreSQL自动进行了转换,把字符‘2’转换成了数字2;‘b’=‘b’为相同的字符比较,因此返回值为true;表达式1+3和表达式2+1的结果不相等,返回值为false;由于‘=’不能用于空值NULL的判断,因此返回值为空。
图5-19 SQL语句执行结果
等于运算符在进行数值比较时有如下规则:
(1)若有一个或两个参数为NULL,则比较运算的结果为空。
(2)若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。
(3)若两个参数均为整数,则按照整数进行比较。
(4)若一个字符串和数字进行相等判断,则PostgreSQL可以自动将字符串转换为数字。
2. 不等于运算符(<>或者!=)
‘<>’或者‘!=’用于判断数字、字符串、表达式不相等的判断,如果不相等,返回t;否则返回f。这两个运算符不能用于判断空值NULL。
【例5.20】使用‘<>’和‘!=’进行不相等的判断,SQL语句如下:
SELECT 'good'<>'god', 1<>2, 4!=4, 5.5!=5, (1+3)!=(2+1),NULL<>NULL;
语句执行后,结果如图5-20所示。
图5-20 SQL语句执行结果
由结果可以看到,两个不等于运算符的作用相同,都可以判断数字、字符串、表达式的比较判断。
3. 小于等于运算符(<=)
‘<=’用来判断左边的操作数是否小于或者等于右边的操作数。如果小于或者等于,返回值为t,否则返回值为f。‘<=’不能用于判断空值NULL。
【例5.21】使用‘<=’进行比较判断,SQL语句如下:
SELECT 'good'<='god', 1<=2, 4<=4, 5.5<=5, (1+3) <= (2+1),NULL<=NULL;
语句执行后,结果如图5-21所示。
图5-21 SQL语句执行结果
由结果可以看到,左边操作数小于或者等于右边时,返回值为t,例如4<=4;当左边操作数大于右边时,返回0,例如‘good’第三个位置的‘o’字符在字母表中的顺序大于‘god’中的第三个位置的‘d’字符,因此返回f;同样比较NULL值时返回空。
4. 小于运算符(<)
‘<’运算符用来判断左边的操作数是否小于右边的操作数,如果小于,返回值为t,否则返回f。‘<’不能用于判断空值NULL。
【例5.22】使用‘<’进行比较判断,SQL语句如下:
SELECT 'good'<'god', 1<2, 4<4, 5.5<5, (1+3) < (2+1),NULL<NULL;
语句执行后,结果如图5-22所示。
图5-22 SQL语句执行结果
由结果可以看到,左边操作数小于或者等于右边时,返回值为t,例如1<2;当左边操作数大于右边时,返回0,例如‘good’第三个位置的‘o’字符在字母表中的顺序大于‘god’中的第三个位置的‘d’字符,因此返回f;同样比较NULL值时返回NULL。
5. 大于等于运算符(>=)
‘>=’运算符用来判断左边的操作数是否大于或者等于右边的操作数,如果大于或者等于,返回值为t,否则返回f。‘>=’不能用于判断空值NULL。
【例5.23】使用‘>=’进行比较判断,SQL语句如下:
SELECT 'good'>='god', 1>=2, 4>=4, 5.5>=5, (1+3) >= (2+1),NULL>=NULL;
语句执行后,结果如图5-23所示。
图5-23 SQL语句执行结果
由结果可以看到,左边操作数大于或者等于右边时,返回值为t,例如4>=4;当左边操作数小于右边时,返回f,例如1>=2;同样比较NULL值时返回空值。
6. 大于运算符(>)
‘>’运算符用来判断左边的操作数是否大于右边的操作数,如果大于,返回值为1,否则返回0。‘>’不能用于判断空值NULL。
【例5.24】使用‘>’进行比较判断,SQL语句如下:
SELECT 'good'>'god', 1>2, 4>4, 5.5>5, (1+3) > (2+1),NULL>NULL;
语句执行后,结果如图5-24所示。
图5-24 SQL语句执行结果
由结果可以看到,左边操作数大于或者等于右边时,返回值为t,例如5.5>5;当左边操作数小于右边时,返回f,例如1>2;同样比较NULL值时返回空值。
7. BETWEEN AND运算符
BETWEEN AND运算符的语法格式为:expr BETWEEN min AND max。假如expr大于或等于min且expr小于或等于max,则BETWEEN的返回值为t,否则返回f。
【例5.25】使用BETWEEN AND进行值区间判断,输入SQL语句如下:
SELECT 4 BETWEEN 2 AND 5, 4 BETWEEN 4 AND 6,12 BETWEEN 9 AND 10;
语句执行后,结果如图5-25所示。
由结果可以看到,4在端点值区间内或者等于其中一个端点值时,BETWEEN AND表达式返回值为t;12并不在指定区间内,因此返回f。
图5-25 SQL语句执行结果
【例5.26】使用BETWEEN AND进行字符串的比较,输入SQL语句如下:
SELECT 'x' BETWEEN 'f' AND 'g', 'b' BETWEEN 'a' AND 'c';
语句执行后,结果如图5-26所示。
图5-26 SQL语句执行结果
对于字符串类型的比较,按字母表中的字母顺序进行比较,‘x’不在指定的字母区间内,因此返回f,而‘b’位于指定字母区间内,因此返回t。
8. LEAST运算符
LEAST运算符的语法格式为:LEAST(值1,值2,...,值n)。其中,值n表示参数列表中有n个值。在有两个或多个参数的情况下,返回最小值,假如任意一个值为NULL,则在比较中忽略不计。
【例5.27】使用LEAST运算符进行大小判断,SQL语句如下:
SELECT least(2,0), least(20.0,3.0,100.5), least('a','c','b'),least(10,NULL);
语句执行后,结果如图5-27所示。
图5-27 SQL语句执行结果
由结果可以看到,当参数中是整数或者浮点数的时候,LEAST将返回其中最小的值;当参数为字符串时,返回字母表中顺序最靠前的字符;当比较值列表中有NULL时,忽略不计,返回值为10。
9. GREATEST (value1,value2,...)
语法格式为:GREATEST(值1, 值2, ..., 值n)。其中,n表示参数列表中有n个值。当有两个或多个参数时,返回值为最大值,假如任意一个自变量为NULL,则在比较中忽略不计。
【例5.28】使用GREATEST运算符进行大小判断,SQL语句如下:
SELECT greatest(2,0), greatest(20.0,3.0,100.5), greatest('a','c','b'),greatest(10,NULL);
语句执行后,结果如图5-28所示。
图5-28 SQL语句执行结果
由结果可以看到,当参数中是整数或者浮点数的时候,GREATEST将返回其中最大的值;当参数为字符串时,返回字母表中顺序最靠后的字符;当比较值列表中有NULL时,忽略不计,返回值为10。
10. IN、NOT IN运算符
IN运算符用来判断操作数是否为IN列表中的其中一个值,如果是,那么返回值为t,否则返回值为f。
NOT IN运算符用来判断操作数是否为IN列表中的其中一个值,如果不是,那么返回值为t,否则返回值为f。
【例5.29】使用NOT IN运算符进行判断,SQL语句如下:
SELECT 2 IN (1,2,5,8), 3 IN (1,2,5,8);
语句执行后,结果如图5-29所示。
图5-29 SQL语句执行结果
【例5.30】使用NOT IN运算符进行判断,SQL语句如下:
SELECT 2 NOT IN (1,2,5,8), 3 NOT IN (1,2,5,8);
语句执行后,结果如图5-30所示。
图5-30 SQL语句执行结果
由结果可以看到,IN和NOT IN的返回值正好相反。
在左侧表达式为NULL的情况下,或者表中找不到匹配项并且表中有一个表达式为NULL的情况下,IN的返回值均为空值。
【例5.31】存在NULL值时的IN运算,SQL语句如下:
SELECT NULL IN (1,3,5),10 IN (1,3,NULL);
语句执行后,结果如图5-31所示。
图5-31 SQL语句执行结果
IN()运算符也可用于在SELECT语句中进行嵌套子查询,在后面的章节中将会讲到。
11. LIKE
LIKE运算符用来匹配字符串,语法格式为:expr LIKE匹配条件。如果epxr满足匹配条件,就返回t(TRUE);如果不匹配,则返回f(FALSE)。若expr或匹配条件中任何一个为NULL,则结果为空值。
LIKE运算符在进行匹配时,可以使用下面两种通配符:
(1)‘%’,匹配任何数目的字符,甚至包括零字符。
(2)‘_’,只能匹配一个字符。
【例5.32】使用运算符LIKE进行字符串匹配运算,SQL语句如下:
SELECT 'stud' LIKE 'stud', 'stud' LIKE 'stu_','stud' LIKE '%d','stud' LIKE 't___', 's' LIKE NULL;
语句执行后,结果如图5-32所示。
图5-32 SQL语句执行结果
由结果可以看到,指定匹配字符串为“stud”。“stud”表示直接匹配“stud”字符串,满足匹配条件,返回true;“stu_”表示匹配以stu开头的长度为4个字符的字符串,“stud”正好是4个字符,满足匹配条件,因此匹配成功,返回true;“%d”表示匹配以字母“d”结尾的字符串,“stud”满足匹配条件,匹配成功,返回true;“t_ _ _”表示匹配以‘t’开头的长度为4个字符的字符串,“stud”不满足匹配条件,因此返回false;当字符‘s’与NULL匹配时,结果为空值。
5.3.4 逻辑运算符
在SQL中,所有逻辑运算符的求值所得结果均为TRUE、FALSE或空值。不同数据库中的表示方法相同。PostgreSQL中包含表5.8所示的逻辑运算符。
表5.8 PostgreSQL中的逻辑运算符
逻辑运算符的操作参数为布尔型数据。接下来,分别讨论不同的逻辑运算符的使用方法。
1. NOT
逻辑非运算符NOT表示当操作数为TRUE时,所得值为f;当操作数为FALSE时,所得值为t,当操作数为NULL时,所得的返回值为空值。
【例5.33】分别使用非运算符“NOT”进行逻辑判断,SQL语句如下:
SELECT NOT '1', NOT 'y', NOT '0', NOT NULL, NOT 'n';
语句执行后,结果如图5-33所示。
图5-33 SQL语句执行结果
由结果可以看到,布尔值'1'的NOT值为false,对于NULL的运算结果为空值。
注 意
逻辑运算符的参数必须是布尔变量,如果随意输入其他类型的数值,就将会弹出错误提示信息。
2. AND
逻辑与运算符AND表示当所有操作数均为TRUE并且不为NULL时,计算所得结果为t,当一个或多个操作数为FALSE时,所得结果为f,其余情况返回值为空值。
【例5.34】分别使用与运算符“AND”进行逻辑判断,SQL语句如下:
SELECT '1'AND 'y','1'AND '0','1'AND NULL, '0'AND NULL;
语句执行后,结果如图5-34所示。
图5-34 SQL语句执行结果
由结果可以看到,“'1'AND 'y'”中没有FALSE或者NULL,因此结果为true;“'1'AND '0'”中有操作数'0',因此结果为false;“'1'AND NULL”中有NULL,返回结果为空值;“'0'AND NULL”中虽然也有NULL,但是有'0'值,所得结果为false。
提 示
“AND”运算符可以有多个操作数,但要注意:多个操作数运算时,AND两边一定要使用空格隔开,不然会影响结果的正确性。
3. OR
逻辑或运算符OR表示当两个操作数均为非NULL值时,任意一个操作数为TRUE,则结果为t,否则结果为f;有一个操作数为NULL时,若另一个操作数为TRUE,则结果为t,否则结果为空值;当两个操作数均为NULL时,所得结果为空值。
【例5.35】使用或运算符“OR”进行逻辑判断,SQL语句如下:
SELECT '1' OR 't' OR '0', '1'OR 'y','1' OR NULL, '0'OR NULL, NULL OR NULL;
语句执行后,结果如图5-35所示。
图5-35 SQL语句执行结果
由结果可以看到,“'1' OR 't' OR '0'”中有'0',但同时包含有'1'和't',返回结果为t;“'1'OR'y'”中没有FALSE值,返回结果为t;“'1' OR NULL”中虽然有NULL,但是有操作数'1',返回结果为t;“'0' OR NULL”中没有FALSE值,并且有NULL,返回结果为空值;“NULL OR NULL”中只有NULL,返回结果为空值。
5.3.5 运算符的优先级
运算的优先级决定了不同的运算符在表达式中计算的先后顺序。表5.9列出了PostgreSQL中的各类运算符及优先级。
表5.9 运算符按优先级由低到高排列
可以看到,不同运算符的优先级是不同的。一般情况下,级别高的运算符先进行计算,如果级别相同,PostgreSQL按表达式的顺序从左到右依次计算。当然,在无法确定优先级的情况下,可以使用圆括号()来改变优先级,并且这样会使计算过程更加清晰。