2016-05-25 51 views
0

我有這個疑問:爲什麼要在MySQL中使用EXISTS()函數?

SELECT * FROM mytable t1 
    WHERE t1.id = :id AND 
     EXISTS(SELECT 1 FROM t2 WHERE t2.post_id = :id) 

當我刪除EXISTS()功能,仍然是我的代碼工作:

SELECT * FROM mytable t1 
    WHERE t1.id = :id AND 
     (SELECT 1 FROM t2 WHERE t2.post_id = :id LIMIT 1) 

那麼,爲什麼我寫的是什麼?它有什麼優勢?

+0

參考存在於第一個匹配的回報。子查詢檢索所有匹配的記錄。閱讀手冊。 – Pred

+0

@Pred感謝您的提示。但是我編輯了第二個查詢,現在有什麼不同了嗎? –

+0

符合ANSI SQL是其中一個原因。 – jarlh

回答

2

簡而言之:

  • EXISTS返回時,它找到的第一個結果,而不是提取所有匹配的記錄的(因此它是更有效的,當有多個記錄mathing的規定 - )
  • EXISTS是語義正確的。
  • 當有列名,而不是1在第二查詢,該列包含NULLFALSE0等,MySQL將隱式轉換到FALSE,從而導致錯誤的結果。
  • EXISTS實際上是由ANSI標準定義的,而第二種形式不是。 (第二個查詢可以在其他DBMS失敗)

作爲一個額外的方面說明,你是罰款*太當您使用EXISTS,因爲它會檢查是否有匹配的記錄,而不是價值。

0

如果子查詢返回任何行,則EXISTS子查詢爲TRUE,NOT EXISTS子查詢爲FALSE。

而當你使用... (SELECT 1 FROM t2 WHERE t2.post_id = :id LIMIT 1)你要麼上沒有的東西,分別認爲是TrueFalse返回成功1NULL

Exists工作是更專業,因爲:

傳統上,存在具有SELECT *子查詢開始,但它可以用SELECT 5開頭或選擇列1或任何東西。 MySQL在這樣的子查詢中忽略了SELECT列表,所以它沒有區別。

它需要最好的方式返回TrueFalse。從MySQL Dev site

相關問題