ORACLE从零开始系列之SQL(一)

前言

ORACLE数据库作为全世界目前应用最为广泛的关系型数据库,其功能性和稳定性得到全世界的一致认可,从今天起“ORACLE从零开始系列”将从头系统的介绍oracle数据库的

sql语句、内部架构、功能特性及其高可用等知识。学无止境,天外有天,本文旨在将本人掌握的oracle知识进行分享,若有纰漏,请各位看官指正。


 

本小节知识点

SQL语句逻辑运算符与null的关系与使用


 

正文

在oracle数据库中,逻辑操作包含AND、OR、NOT三种,首先我们来看一下这三种逻辑运算的真值表

表1AND的真值表


TRUE

FALSE

NULL

TRUE

TRUE

FALSE

NULL

FALSE

FALSE

FALSE

FALSE

NULL

NULL

FALSE

NULL

表2OR的真值表


TRUE

FALSE

NULL

TRUE

TRUE

TRUE

TRUE

FALSE

TRUE

FALSE

NULL

NULL

TRUE

NULL

NULL

表3NOT的真值表

TRUE

FALSE

NULL

FALSE

TRUE

NULL

(以上图片均摘自网络)
我们可以看到在and真值表中and和null碰到一起时无非两种结果,一种是null,一种是false(false+null),也就是说在and中和null有关的运算都不会返回数据。我们来做以下实验:
实验表结构:
EMPNONOTNULLNUMBER(4)

ENAMEVARCHAR2(10)

JOBVARCHAR2(9)

MGRNUMBER(4)

HIREDATEDATE

SALNUMBER(7,2)

COMMNUMBER(7,2)

DEPTNONUMBER(2)

实验表数据:
SQL>set pages 30

SQL> select * from scott.emp;


     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7654 MARTIN     SALESMAN           0 28-SEP-81       1250       1400         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7844 TURNER     SALESMAN           0 08-SEP-81       1500          0         30

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

      7900 JAMES      CLERK              0 03-DEC-81        950                    30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10


and是同时满足,只有当两个条件都为true时才能返回结果

SQL> select * from scott.emp where sal>500 and job is null;

no rows selected

这条语句能返回结果吗?

SQL>select * from scott.emp where sal>500 and job is null;

norowsselected

因为job字段当中没有为null的值,所以jobisnull的结果为null,true+null的结果也就为null了。

我们再来看OR

OR运算的算法是只要一个条件为true就返回结果

上面那条语句我们将and改为or

SQL> select * from scott.emp where sal>500 or job is null;


     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7654 MARTIN     SALESMAN           0 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN           0 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7900 JAMES      CLERK              0 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10



接着

SQL> select * from scott.emp where not (not mgr=null and mgr!=0);


     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7654 MARTIN     SALESMAN           0 28-SEP-81       1250       1400         30
      7844 TURNER     SALESMAN           0 08-SEP-81       1500          0         30
      7900 JAMES      CLERK              0 03-DEC-81        950                    30



这条语句为何有值

因为 (not mgr=null)=null,整个条件看起来就是 not(null and true(或者false),由于null and false为null,null and true 为false,所以当mgr等于0时,整条语句就会返回值NOT FALSE=TRUE。



good luck
sean
qq 2087425608
2014.3.4


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27153401/viewspace-1100922/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/27153401/viewspace-1100922/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值