首頁 > 資料庫 > mysql教程 > SQL 中的 LEFT JOIN:「ON」和「WHERE」子句之間的主要差異是什麼?

SQL 中的 LEFT JOIN:「ON」和「WHERE」子句之間的主要差異是什麼?

Barbara Streisand
發布: 2025-01-03 00:18:40
原創
632 人瀏覽過

LEFT JOIN in SQL:  What's the Key Difference Between `ON` and `WHERE` Clauses?

有條件的 LEFT JOIN:ON 和 WHERE 之間的差異在哪裡?

在 SQL Server 中,LEFT JOIN 根據下列條件組合來自兩個資料表的資料列指定的連接條件。 ON 子句定義 LEFT JOIN 語句中的聯結條件,而 WHERE 子句則在聯結操作之後過濾資料列。如果沒有正確理解,這種微妙的差異可能會導致意外結果。

考慮以下查詢:

SELECT t1.f2
FROM   t1
LEFT JOIN t2
ON t1.f1 = t2.f1 AND cond2 AND t2.f3 > something
登入後複製

令人驚訝的是,此查詢不會產生與以下查詢相同的結果:

SELECT t1.f2
FROM   t1
LEFT JOIN t2
ON t1.f1 = t2.f1 AND cond2
WHERE  t2.f3 > something
登入後複製

解釋

ON子句在決定哪些行參與聯結方面起著至關重要的作用。 ON 中指定的條件必須為真,才能符合並包含在連線結果中的行。相反,WHERE 子句過濾已經連接的行。

在第一個查詢中,條件 t2.f3 > some 是 ON 子句的一部份。因此,只有 t2.f3 大於某值的行才會包含在連線中。這表示 t2.f3 不大於某值的任何符合行都將從結果中排除。

在第二個查詢中,條件 t2.f3 > > some 是 WHERE 子句的一部份。該子句在執行連接後進行評估。因此,所有滿足 ON 子句條件(t1.f1 = t2.f1 和 cond2)的行都會成為聯結結果的一部分。然後,WHERE 子句過濾這些行,只保留 t2.f3 大於某值的行。

範例

為了說明這個概念,請考慮一個候選表 (候選人)和投票表(選票)。如果我們想尋找已收到選票的候選人,我們可以使用 LEFT JOIN:

SELECT  *
FROM    candidates c
LEFT JOIN    
        votes v
ON      c.name = v.voted_for
登入後複製

此查詢返回所有候選人,甚至包括那些沒有收到任何選票的候選人。如果我們將條件移至 WHERE 子句:

SELECT  *
FROM    candidates c
LEFT JOIN    
        votes v
ON      c.name = v.voted_for
WHERE   v.voted_for IS NOT NULL
登入後複製

結果現在只包括至少獲得一票的候選人。

結論

理解 LEFT JOIN 中 ON 和 WHERE 子句的差異對於有效操作資料至關重要。透過仔細地將條件放入適當的子句中,您可以確保您的查詢傳回所需的結果。

以上是SQL 中的 LEFT JOIN:「ON」和「WHERE」子句之間的主要差異是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板