【DB筆試面試477】NULL有哪些注意事項?
- 2019 年 10 月 11 日
- 筆記
NULL有哪些注意事項?
答案部分
在運算時,NULL(空)值不參與運算。判斷是否為NULL值只能用IS NULL或IS NOT NULL,不能用=NULL或<>NULL,有關NULL值有如下幾點需要注意:
① 空值是無效的、未指定的、未知的或不可預知的值。
② 空值不是空格,也不是0。
③ 包含空值的數學表達式的值(即加減乘除等操作)都為空值NULL。
④ 對空值進行連接字元串的操作之後,返回被連接的字元串。
⑤ 用IS NULL來表示為空,用IS NOT NULL來表示不為空,除此之外沒有其它的表示方法了,這一點尤為重要。
⑥ COUNT(1)、COUNT(*)、COUNT(ROWID)、COUNT(常量)、COUNT(主鍵)、COUNT(非空列)這幾種方式統計的行數是表中所有存在的行的總數,包括值為NULL的行和非空行。所以,這幾種方式的執行結果相同。通過10053事件可以看到這幾種方式除了COUNT(ROWID)之外,其它最終都會轉換成COUNT(*)的方式來執行。需要注意的是:這裡的COUNT(1)中的「1」並不表示表中的第一列,它其實是一個表達式,可以換成任意數字或字元或表達式。
a.COUNT(允許為空列) 這種方式統計的行數不會包括欄位值為NULL的行。
b.COUNT(DISTINCT 列名) 得到的結果是除去值為NULL和重複數據後的結果。
⑦ NULL在排序中默認為最大值,DESC在最前,ASC在最後,可以加上NULLS LAST來限制NULL值的顯示。
⑧ 如果子查詢結果中包含NULL值,那麼NOT IN (NULL、AA、BB、CC)返回為空。示例如下:
SYS@lhrdb> SELECT COMM,COUNT(1) FROM SCOTT.EMP GROUP BY COMM; COMM COUNT(1) ---------- ---------- 10 1400 1 500 1 300 1 0 1 SYS@lhrdb> SELECT B.EMPNO, B.COMM FROM SCOTT.EMP B WHERE B.SAL IN (800,1600); EMPNO COMM ---------- ---------- 7369 7499 300 SYS@lhrdb> SELECT * FROM SCOTT.EMP A WHERE A.COMM NOT IN (SELECT B.COMM FROM SCOTT.EMP B WHERE B.SAL IN (800,1600)) ; no rows selected SYS@lhrdb> SELECT * FROM SCOTT.EMP A WHERE A.COMM NOT IN (SELECT B.COMM FROM SCOTT.EMP B WHERE B.SAL IN (800,1600) AND B.COMM IS NOT NULL ) ; --正確寫法 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30 7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30 7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
在SCOTT.EMP表,除了COMM為空和300的記錄還有COMM為1400、500和0的記錄。
本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。
About Me:小麥苗
● 本文作者:小麥苗,只專註於資料庫的技術,更注重技術的運用
● 作者部落格地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列題目來源於作者的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解
● 版權所有,歡迎分享本文,轉載請保留出處
● 題目解答若有不當之處,還望各位朋友批評指正,共同進步