8.1.8 AND、OR、NOT逻辑运算符
前面介绍的SELECT语句的WHERE子句中均只包含一个条件,有时候需要根据多个查询条件来提取结果值。比如想知道部门编号为20并且工资大于1000的员工列表,此时可以通过使用AND、OR、NOT逻辑运算符来合并多个布尔表达式,实现复杂的条件查询,这3个运算符的作用如下所示。
AND运算符:又称与运算符,如果AND左右两侧的表达式结果都为True,那么结果就为True。
OR运算符:又称或运算符,如果OR左右两侧的表达式只要有一个结果为True,那么结果就为True。
NOT运算符:又称取反运算符,NOT通常是单目运算符,即NOT右侧才能包含表达式,是对结果取反,如果表达式结果为True,那么NOT的结果就为False;否则如果表达式的结果为False,那么NOT的结果就为True。
下面的代码查询1982年入职且部门编号为20的员工列表,因为既要匹配年份为1982年,同时又要匹配员工的部门编号为20,因此选择使用AND运算符,如下查询所示:SQL>SELECT empno 员工编号, ename 姓名, job 职位, mgr 经理, hiredate 雇佣日期, sal 薪资,deptno 部门编号 FROM emp WHEREdeptno=20AND hiredate like '%82';
员工编号 姓名 职位 经理 雇佣日期 薪资 部门编号
-------------------------------------------------------------------
7788 斯科特 职员 7566 09-12月-82 1760.2 20
对于AND运算符来说,要求两边的表达式结果都为True,因此通常称为全运算符,如果任何一方的返回结果为NULL或False,那么逻辑运算的结果就为False,也就是说记录不匹配WHERE子句的要求。
把查询的要求换一换,如果查询部门编号为20的员工,或者入职日期为1981年的员工,也就是说员工的入职日期只要是1981年的,无论是否属于部门编号20,都是符合查询要求的;同时如果部门编号为20,无论是否为1981年入职,也是符合查询的要求的。下面的语句演示了如何使用OR运算符来实现这种或运算:SQL>SET pagesize 200;
SQL>SELECT empno 员工编号, ename 姓名, job 职位, mgr 经理, hiredate 雇佣日期,
sal 薪资,deptno 部门编号 FROM emp WHEREdeptno=20OR hiredate like '%81';
员工编号 姓名 职位 经理 雇佣日期 薪资 部门编号
---------------------------------------------------------------------
7369 史密斯 职员 7902 17-12月-80 1755.2 20
7499 艾伦 销售人员 7698 20-2月 -81 1700 30
7521 沃德 销售人员 7698 22-2月 -81 1350 30
7566 约翰 经理 7839 02-4月 -81 3570 20
7654 马丁 销售人员 7698 28-2月 -81 1350 30
7698 布莱克 经理 7839 01-3月 -81 2850 30
7782 克拉克 经理 7839 09-5月 -81 3587.05 10
7788 斯科特 职员 7566 09-12月-82 1760.2 20
7839 金 老板 17-11月-81 8530.5 10
7844 特纳 销售人员 7698 08-8月 -81 1600 30
7876 亚当斯 职员 7788 12-1月 -83 1440 20
7900 吉姆 职员 7698 03-12月-81 1050 30
7902 福特 分析人员 7566 03-12月-81 3600 20
7892 张八 20
7893 霍九 20
7894 霍十 20
7895 APPS 05-9月 -11 3000 20
7903 通利 职员 04-12月-81 2000
7904 罗威 职员 08-12月-81 2000
7898 O'Malley 20
已选择20行。
OR运算符又称或运算符,也就是说只要左右两侧的布尔表达式任何一方为True,结果就为True,因此可以看到查询结果返回了部门编号为10、20或30的员工,对于部门编号不为20的员工,其年份一定是1981年入职的。
NOT运算符用来取表达式结果的反向值,NOT运算符是单目运算符,也就是说只能在其右侧包含表达式(可以用括号括起来嵌套的布尔表达),在布尔表达式前面应用NOT运算符后,结果为True的表达式最终返回False,而结果为False的会反转为True。
如果查询emp表中,部门编号不属于20同时入职日期也不是1982年的员工,这里需要使用一个AND运算符来组合两个条件,***在布尔表达式的前面使用NOT运算符来取反,就取得了条件所要求的结果,如下语句所示:SELECT empno,ename,job,mgr,hiredate,sal,deptno
FROM emp
WHERE NOT (deptno=20AND hiredate like '%82');
当查询条件中包含AND、OR和NOT运算符时,如何确定查询的结果值,这里需要了解逻辑运算符的优先级。在上面的语句中包含了NOT和AND运算符,由于必须先进行AND运算,因此使用具有高优先级的括号将AND运算符括起来,在计算完AND运算符的结果后,再进行NOT运算。
在NOT运算符后面可以跟IN、LIKE、BETWEEN-AND和NULL关键字,比如前面介绍过的IS NOT NULL 就使用NOT运算符,下面的代码使用NOT IN来查询职位不是"职员"、"经理"以及"销售人员"的人员信息,语法如下所示:SQL>SELECT empno 员工编号, ename 姓名, job 职位, mgr 经理, hiredate 雇佣日期, sal 薪资,deptno 部门编号 FROM emp WHERE job NOT IN ('职员','经理','销售人员');
员工编号 姓名 职位 经理 雇佣日期 薪资 部门编号
---------------- --------------- ------------------ ------------ ---------
7839 金 老板 17-11月-81 8530.5 10
7902 福特 分析人员 7566 03-12月-81 3600 20
7892 张八 IT维护
下面的语句使用NOT BETWEEN..AND进行范围取反,查询工资范围为1000~2500以外的员工列表: SELECT empno,ename,job,mgr,hiredate,sal,deptno
FROM emp
WHERE sal NOT BETWEEN 1000 AND 2500;
在使用通配符进行模糊查询时,也可以使用NOT运算符,下面的代码使用LIKE运算符查询员工编号中不包含大写字母A的员工列表: SELECT empno,ename,job,mgr,hiredate,sal,deptno
FROM emp
WHERE ename NOT LIKE '%A%';
当多个逻辑运算符组合使用时,必须要了解这几个运算符的优先级,常用的优先级顺序如表8.2所示。
表8.2 WHERE子句中的运算符优先级
计算顺序
运算符
1
算术运算符,例如+、-、*、/运算符
2
连接运算符,例如||运算符
3
比较运算符,例如>、=、<=、<>运算符
4
IS [NOT] NULL,LIKE,[NOT] IN
5
[NOT] BETWEEN
6
NOT逻辑条件
7
AND逻辑条件
8
OR逻辑条件
可以看到,逻辑运算符的优先级在表中处于较低的位置,有时为了使代码具有良好的可读性,使用括号来改变优先级并提供良好的优先级。当包含了括号之后,根据括号的层次结构,从左至右依次进行运算。
【责任编辑:book TEL:(010)68476606】
点赞 0