理解null如何影響in和exits語句

2021-04-06 16:22:22 字數 2399 閱讀 5962

從表面上看,in和exits的sql語句是可互換和等效的。然而,它們在處理uull資料時會有很大的差別,並導致不同的結果。問題的根源是在乙個oracle資料庫中,乙個null值意味著未知變數,所以操作null值的比較函式的結果也是乙個未知變數,而且任何返回null的值通常也被忽略。例如,以下查詢都不會返回一行的值:

select ''true'' from dual where 1 = null;

select ''true'' from dual where 1 != null;

只有is null才能返回true,並返回一行:

select ''true'' from dual where 1 is null;

select ''true'' from dual where null is null;

當你選擇使用in,你將會告訴sql選擇乙個值並與其它每一值相比較。如果null值存在,將不會返回一行,即使兩個都為null。

select ''true'' from dual where null in (null);

select ''true'' from dual where (null,null) in ((null,null));

select ''true'' from dual where (1,null) in ((1,null));

乙個in語句在功能上相當於 = any語句:

select ''true'' from dual where null = any (null);

select ''true'' from dual where (null,null) = any ((null,null));

select ''true'' from dual where (1,null) = any ((1,null));

當你使用乙個exists等效形式的語句,sql將會計算所有行,並忽略子查詢中的值。

select ''true'' from dual where exists (select null from dual);

select ''true'' from dual where exists (select 0 from dual where null is null);

in 和exists在邏輯上是相同的。in語句比較由子查詢返回的值,並在輸出查詢中過濾某些行。exists語句比較行的值,並在子查詢中過濾某些行。對於null值的情況,行的結果是相同的。

select ename from emp where empno in (select mgr from emp);

select ename from emp e where exists (select 0 from emp where mgr = e.empno);

然而當邏輯被逆向使用,即not in 及not exists時,問題就會產生:

select ename from emp where empno not in (select mgr from emp);

select ename from emp e where not exists (select 0 from emp where mgr =

e.empno );

not in 語句實質上等同於使用=比較每一值,如果測試為false或者null,結果為比較失敗。例如:

select ''true'' from dual where 1 not in (null,2);

select ''true'' from dual where 1 != null and 1 != 2;

select ''true'' from dual where (1,2) not in ((2,3),(2,null));

select ''true'' from dual where (1,null) not in ((1,2),(2,3));

這些查詢不會返回任何一行。第二個查詢語句更為明顯,即 1 != null ,所以整個where都為false。然而這些查詢語句可變為:

select ''true'' from dual where 1 not in (2,3);

select ''true'' from dual where 1 != 2 and 1 != 3;

你也可以使用not in查詢,只要你保證返回的值不會出現null值:

select ename from emp where empno not in (select mgr from emp where mgr is not

null );

select ename from emp where empno not in (select nvl(mgr,0) from emp);

通過理解in, exists, not in,以及not exists之間的差別,當null出現在任一子查詢中時,你可以避免一些常見的問題。

如何正確理解 SQL 中的 NULL

在 sql 語句中,null 值與字元列中的空格,數字中的零,字元列中的 null ascii 字元都不相同.當dbms在一列中發現乙個 null 值時,就將其翻譯為未定義或是不可用的.dbms不能在一列中做出有關 null 的假設,也不能假設 null 值等於 null,造成某一列成為 null ...

MySQL中對於NULL值的理解和使用教程

null值的概念是造成sql的新手的混淆的普遍原因,他們經常認為null是和乙個空字串 的一樣的東西。不是這樣的!例如,下列語句是完全不同的 mysql insert into my table phone values null mysql insert into my table phone v...

如何理解 form for 和 form tag

在我們使用rails的過程中,必然離不開form for,甚至在剛入門沒有多長的時間裡就會接觸到form for。本來form for並不是乙個如何特別神奇的東西,無非就是乙個helper,helper的作用是什麼?對於helper而言,無論它的邏輯多麼的複雜,其實本質的作用就是生成html 所以我...