ORACLE從零開始系列之SQL(一)

seansql發表於2014-03-04

前言

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章