亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“不存在”與“左聯接”之間有什么區別?

“不存在”與“左聯接”之間有什么區別?

哈士奇WWW 2019-06-15 13:04:00
“不存在”與“左聯接”之間有什么區別?在我看來,您可以在SQL查詢中使用“不存在”、“不使用IN”或“左聯接為空”來執行相同的操作。例如:SELECT a FROM table1 WHERE a NOT IN (SELECT a FROM table2)SELECT a FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.a = table2.a) SELECT a FROM table1 LEFT JOIN table2 ON table1.a = table2.a WHERE table1.a IS NULL我不確定是否所有語法都是正確的,但這是我所見過的一般技巧。我為什么要選擇一個而另一個呢?表現不同嗎.?其中哪一個是最快/最有效的?(如果這取決于實現,何時使用?)
查看完整描述

3 回答

?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

簡而言之:

NOT IN有點不同:如果只有一個NULL在名單上。

  • 在……里面MySQLNOT EXISTS效率有點低

  • 在……里面SQL ServerLEFT JOIN / IS NULL效率較低

  • 在……里面PostgreSQLNOT IN效率較低

  • 在……里面Oracle,這三種方法都是相同的。


查看完整回答
反對 回復 2019-06-15
?
MYYA

TA貢獻1868條經驗 獲得超4個贊

如果數據庫擅長優化查詢,那么第一個查詢將被轉換為接近第三個查詢的查詢。

對于問題中的簡單情況,應該很少或根本沒有區別,因為它們都將以聯接的形式執行。在更復雜的查詢中,數據庫可能無法從not innot exists開雷耶斯。在這種情況下,查詢將變得更慢。另一方面,如果沒有可以使用的索引,聯接也可能執行不好,所以僅僅因為使用聯接并不意味著您是安全的。您必須檢查查詢的執行計劃,以判斷是否存在性能問題。


查看完整回答
反對 回復 2019-06-15
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

假設您正在避免空值,它們都是編寫反連接使用標準SQL。

一個明顯的遺漏是等效的使用EXCEPT:

SELECT a FROM table1EXCEPTSELECT a FROM table2

注在Oracle中,您需要使用MINUS運算符(可以說是一個更好的名稱):

SELECT a FROM table1
MINUSSELECT a FROM table2

說到專有語法,也可能有非標準的等價物值得研究,這取決于您正在使用的產品。OUTER APPLY在SQLServer中(類似于):

SELECT t1.a  FROM table1 t1       OUTER APPLY 
       (
        SELECT t2.a          FROM table2 t2         WHERE t2.a = t1.a       ) AS dt1 WHERE dt1.a IS NULL;


查看完整回答
反對 回復 2019-06-15
  • 3 回答
  • 0 關注
  • 541 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號