ORACLE的count與空值比較
今天,一同事問我,有個問題很奇怪,他寫的SQL語句不統計null值,怎麼一回事,看下面重現:
參與的實驗資料:
--建立測試表
create table mytab(
col1 varchar2(10),
col2 varchar2(10),
col3 varchar2(10)
);
--插入測試資料
insert into mytab values ('10010','b1','c1');
insert into mytab values ('10011','b2','c2');
insert into mytab values ('10012','b3','c3');
insert into mytab values ('10012','b4','c4');
insert into mytab values ('10012','b4','c5');
insert into mytab values ('10012','b4','c6');
insert into mytab values ('10013','','');
insert into mytab values ('10013','','c7');
insert into mytab values ('10012','','c9');
insert into mytab values ('10012','b9','');
--同事覺得奇怪的SQL語句及執行結果:
select 'A' as "編號", count(*) from mytab
union
select 'B' as "編號",count(*) from mytab where col2 in('b4','b3')
union
select 'C' as "編號",count(*) from mytab where col2 not in('b4','b3')
union
select 'D' as "編號",count(*) from mytab where col2 is null;
查詢結果:
編號 COUNT(*)
A 10
B 4
C 3
D 3
同事覺得編號為C的統計值,應該包含編號為D的統計值,但是,為什麼編號C沒有包括編號D的值呢?
其實,很簡單:
select 'C' as "編號",count(*) from mytab where col2 not in('b4','b3')
union
select 'H' as "編號",count(*) from mytab where col2 != 'b4' and col2 !='b3'
union
select 'I' as "編號",count(*) from mytab where col2 not in('b4','b3') or col2 is null;
編號 COUNT(*)
C 3
H 3
I 6
參與的實驗資料:
--建立測試表
create table mytab(
col1 varchar2(10),
col2 varchar2(10),
col3 varchar2(10)
);
--插入測試資料
insert into mytab values ('10010','b1','c1');
insert into mytab values ('10011','b2','c2');
insert into mytab values ('10012','b3','c3');
insert into mytab values ('10012','b4','c4');
insert into mytab values ('10012','b4','c5');
insert into mytab values ('10012','b4','c6');
insert into mytab values ('10013','','');
insert into mytab values ('10013','','c7');
insert into mytab values ('10012','','c9');
insert into mytab values ('10012','b9','');
--同事覺得奇怪的SQL語句及執行結果:
select 'A' as "編號", count(*) from mytab
union
select 'B' as "編號",count(*) from mytab where col2 in('b4','b3')
union
select 'C' as "編號",count(*) from mytab where col2 not in('b4','b3')
union
select 'D' as "編號",count(*) from mytab where col2 is null;
查詢結果:
編號 COUNT(*)
A 10
B 4
C 3
D 3
同事覺得編號為C的統計值,應該包含編號為D的統計值,但是,為什麼編號C沒有包括編號D的值呢?
其實,很簡單:
select 'C' as "編號",count(*) from mytab where col2 not in('b4','b3')
union
select 'H' as "編號",count(*) from mytab where col2 != 'b4' and col2 !='b3'
union
select 'I' as "編號",count(*) from mytab where col2 not in('b4','b3') or col2 is null;
編號 COUNT(*)
C 3
H 3
I 6
編號為C的SQL與編號為H的SQL等價,所以C、H的查詢結果也相同,從編號為I的查詢結果,我們就能發現問題在哪,
就是涉及null的比較,正確方法是:null比較相等用is,比較不等用is not,而不能用=或<>,否則統計將排除空值,有下列SQL語句為證:
select 'C' as "編號",count(*) from mytab where col2 not in('b4','b3')
union
select 'D' as "編號",count(*) from mytab where col2 is null
union
select 'E' as "編號", count(*) from mytab where col2 is not null
union
select 'G' as "編號",count(*) from mytab where col2 = null
union
select 'H' as "編號",count(*) from mytab where col2 <> null
union
select 'I' as "編號",count(*) from mytab where col2 not in('b4','b3') or col2 is null;
編號 COUNT(*)
C 3
D 3
E 7
G 0
H 0
I 6
編號為G和編號為H的查詢結果說明null值使用=或<>進行統計時永遠都為0,只有is 或is not才能統計Null值列名,這是個陷阱。
我想起了,自己JAVA面試的時候,經理就問了這麼一個問題,就是涉及空值的where條件語句怎麼寫,答案的關鍵就是要用is 或
is not進行空值比較。
就是涉及null的比較,正確方法是:null比較相等用is,比較不等用is not,而不能用=或<>,否則統計將排除空值,有下列SQL語句為證:
select 'C' as "編號",count(*) from mytab where col2 not in('b4','b3')
union
select 'D' as "編號",count(*) from mytab where col2 is null
union
select 'E' as "編號", count(*) from mytab where col2 is not null
union
select 'G' as "編號",count(*) from mytab where col2 = null
union
select 'H' as "編號",count(*) from mytab where col2 <> null
union
select 'I' as "編號",count(*) from mytab where col2 not in('b4','b3') or col2 is null;
編號 COUNT(*)
C 3
D 3
E 7
G 0
H 0
I 6
編號為G和編號為H的查詢結果說明null值使用=或<>進行統計時永遠都為0,只有is 或is not才能統計Null值列名,這是個陷阱。
我想起了,自己JAVA面試的時候,經理就問了這麼一個問題,就是涉及空值的where條件語句怎麼寫,答案的關鍵就是要用is 或
is not進行空值比較。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29357786/viewspace-2121449/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql中count(1)與count(*)比較MySql
- oracle count null空與''空子行串的記錄嗎OracleNull
- sap與ORACLE的ERP比較Oracle
- 零值比較--BOOL,int,float,指標變數與零值比指標變數
- oracle中字串的大小比較,字串與數字的比較和運算Oracle字串
- SQL server 與Oracle開發比較SQLServerOracle
- Statement Tracer For Oracle 與 SQL Monitor 的比較OracleSQL
- oracle count(expr)計算expr非空的和Oracle
- oracle 壓縮備份與普通備份從空間,時間,CPU效能的比較Oracle
- 比較檔案是否相同,(比較MD5值)
- 不同資料型別與零值比較的if從句資料型別
- Oracle EBS - Forms Servlet與Socket模式比較OracleORMServlet模式
- SAP ERP 與 Oracle ERP 比較Oracle
- Js 比較兩個物件的鍵名與鍵值是否相等JS物件
- SAP ERP 與 Oracle ERP 比較(轉)Oracle
- Oracle date 型別比較和String比較Oracle型別
- oracle 比較日期相等Oracle
- oracle sql日期比較:OracleSQL
- Oracle 在連線條件裡處理和比較 NULL 值OracleNull
- Oracle資料庫的備份與恢復方式比較Oracle資料庫
- PostgreSQL與MySQL的比較 - hackrMySql
- MVVM與MVC模式的比較MVVMMVC模式
- XTask與RxJava的使用比較RxJava
- JavaScript 與 Java、PHP 的比較JavaScriptPHP
- Hadoop與Spark的比較HadoopSpark
- CMM/CMMI 與敏捷的比較敏捷
- Hibernate與 MyBatis的比較MyBatis
- CoffeeScript與Ruby的比較
- DB2常用函式與Oracle比較TIDB2函式Oracle
- Vue與React比較VueReact
- 【Redis與Memcached比較】Redis
- RecyclerView與ListView比較View
- js與jq比較JS
- PostgreSQL與MySQL比較MySql
- Vuex與Redux比較VueRedux
- Go 與 C++ 的對比和比較GoC++
- oralce 壓縮表與heap表儲存空間與查詢效能比較
- 比較全的oracle事件解釋Oracle事件