oracle中not逻辑运算符,8.1.8 AND、OR、NOT逻辑运算符

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值