六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

NULLs如何影響IN與EXISTS

[摘要]如果你的數據庫設計在任何一欄中都允許NULL值的話,你需要了解一下,在你的查詢語句中,不同的子句是怎樣對待這一問題的。 從表面上看,可能顯示出這樣的情形,即SQL子句IN與EXISTS可以互換。然而,在處理NULL值時,它們的表現截然不同,而且得到的結果也很可能不同。問題源于這樣一個事實,即...

    如果你的數據庫設計在任何一欄中都允許NULL值的話,你需要了解一下,在你的查詢語句中,不同的子句是怎樣對待這一問題的。

    從表面上看,可能顯示出這樣的情形,即SQL子句IN與EXISTS可以互換。然而,在處理NULL值時,它們的表現截然不同,而且得到的結果也很可能不同。問題源于這樣一個事實,即在一個Oracle數據庫中,一個NULL值意味著未知,因此,對一個NULL值的任何比較或操作也都是無效的,而任何返回NULL的測試也都被忽視了。例如,以下這些查詢語句都不會返回任何行:

    select 'true' from dual where 1 = null;

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

    值1既不能說是等于NULL,也不能說是不等于NULL。只有是NULL的時候才會返回一個真正的NULL值并返回一行。

    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會計算行數,卻忽視子查詢中的值,就算你返回NULL也一樣。

    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值的情況下,作為結果而出現的那些行是相同的。

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

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

    不過,當邏輯被轉變成使用NOT IN和NOT EXISTS時,問題就出現了,這兩個語句會返回不同的行(第一個查詢會返回0行;第二個返回意想的數據-它們是不同的查詢):

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

    selectename 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是NULL,因此對整個WHERE條件來說都是錯誤的。它們會這樣運行:

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

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

    只要你在結果中阻止系統返回NULL,在這之前你還是可以使用NOT IN查詢(同樣,這些都能運行,不過我假定empno不是NULL,在我們這個案例中,這是一個很好的假設):

    selectename from emp where empno not in (select mgr from emp where mgr is not null);

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

    由于了解了IN,EXISTS,NOT IN,以及NOT EXISTS之間的差別,當一個子查詢的數據中出現NULL時,你就可以避免一個非常普遍的問題了。




主站蜘蛛池模板: 亚州激情 | 日韩一区二区三区四区不卡 | 亚洲最大成人网 色香蕉 | 天天躁夜夜躁狠狠躁躁 | 天天操天天爱天天干 | 天天摸夜夜添久久精品麻豆 | 色www精品视频在线观看 | 台湾中文娱乐综合久久久 | 日本中文字幕网址 | 手机看片福利在线 | 色噜噜噜噜 | 色哟哟色院91精品网站 | 欧美一级在线免费观看 | 四虎影院一区二区 | 无毒不卡| 天天干天天干天天干天天干 | 亚洲国产欧美在线人成精品一区二区 | 五月天天色 | 四虎永久免费网站免费观看 | 一区二区久久 | 亚洲欧美日本视频 | 一二三四在线观看日本 | 欧美一区2区 | 中文在线免费视频 | 日韩一级二级三级 | 青青草国产97免久久费观看 | 日本一区二区三区在线看 | 天天干天天操天天插 | 日韩毛片在线播放 | 性生大片一级毛片免费观看 | 色爱区综合 | 青青在线国产视频 | 午夜精品久久久久久 | 青青青青久在线观看视频 | 全免费午夜一级毛片一级毛 | 日日摸夜夜爽夜夜爽出水 | 青春草在线免费视频 | 天天操欧美 | 亚欧免费视频一区二区三区 | 日本欧美一区二区三区片 | 午夜男人天堂 |