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/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步