首頁 > 資料庫 > mysql教程 > 左連接與內連接:WHERE 子句如何影響左連接的結果?

左連接與內連接:WHERE 子句如何影響左連接的結果?

DDD
發布: 2025-01-03 18:53:44
原創
1090 人瀏覽過

Left Join vs. Inner Join: How Does a WHERE Clause Affect a Left Join's Results?

左聯接與內聯接

在 SQL 中,左聯接與內聯接是產生不同結果集的兩種基本聯結類型。左聯接會傳回左表中的所有行,並根據聯結條件匹配右表中的行。如果未找到匹配項,則右側表中的缺失值將表示為 NULL。相反,內部聯結僅傳回滿足聯結條件的行,排除兩個表中不符合該條件的行。

左聯結行為修改

中提供的SQL 查詢:

SELECT
a.foo
b.bar
c.foobar
FROM tableOne AS a
INNER JOIN tableTwo AS b ON a.pk = b.fk
LEFT JOIN tableThree AS c ON b.pk = c.fk
WHERE a.foo = 'something'
AND c.foobar = 'somethingelse'
登入後複製

後面存在WHERE c.foobar = 'somethingelse' 子句LEFT JOIN 條件具有令人驚訝的效果。它似乎會將左聯接轉換為內聯接,如果 tableThree 中不存在“somethingelse”,則不會傳回任何行。

解釋

這看起來很奇怪行為是由 SQL 語句的評估順序產生。 WHERE 子句在執行連線後進行處理。因此,當在 WHERE 子句中指定 c.foobar = 'somethingelse' 時,它會有效地過濾掉所有左連接中 c.foobar 為 NULL 的行。因此,只有 c.foobar 與指定值('somethingelse')相符的行才會保留在最終結果集中。

保持所需的左連接行為,有兩個選項:

  1. 修改WHERE 子句以修改包含OR c.foobar IS NULL,如下所示:

    WHERE a.foo = 'something'
    AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
    登入後複製

    這允許c.foobar 為 NULL 的行包含在結果集中。

  2. 移動c.foobar = 'somethingelse' 與左連接的ON 子句進行比較,確保結果中僅包含滿足該條件的行設定:

    LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
    登入後複製

以上是左連接與內連接:WHERE 子句如何影響左連接的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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