首頁 > 資料庫 > mysql教程 > SQL 中 INNER JOIN 是否會覆寫前面的 OUTER JOIN?

SQL 中 INNER JOIN 是否會覆寫前面的 OUTER JOIN?

Mary-Kate Olsen
發布: 2025-01-09 10:22:40
原創
816 人瀏覽過

Does an INNER JOIN Override a Preceding OUTER JOIN in SQL?

SQL JOIN:INNER JOIN 是否會覆蓋前面的 OUTER JOIN?

本文探討了 SQL 查詢中 INNER JOINOUTER JOIN 子句之間的交互,特別討論後續 INNER JOIN 是否會抵消前面 OUTER JOIN 的效果。

簡短的回答是:不,不會自動。 然而,INNER JOIN 可以顯著限制前面OUTER JOIN的效果。

關鍵在於ONINNER JOIN子句。如果 ON 子句由於 NULL 而需要可能為 OUTER JOIN 的列,則 INNER JOIN 將有效過濾掉該列為 NULL 的行。 這並不是完全忽略 OUTER JOIN 意義上的“覆蓋”,而是一種過濾效果。

範例 1:INNER JOIN 不會否定 OUTER JOIN

<code class="language-sql">SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN email ON person.email_id = email.id;</code>
登入後複製

這按預期工作。 INNER JOIN 上的 email 只需要有效的 person.email_id。 即使某人沒有地址(address.idNULL),LEFT JOIN 仍然包含他們,如果他們有電子郵件,INNER JOIN 包含該電子郵件資料。

範例 2:INNER JOIN 限制 OUTER JOIN

<code class="language-sql">SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN city ON address.city_id = city.id;</code>
登入後複製

這裡,問題就出現了。 INNER JOIN 上的 city 需要非 NULL address.city_id。 由於 LEFT JOIN 上的 address 可能會產生帶有 NULL address.city_id 的行,因此這些行被 INNER JOIN 排除。 OUTER JOIN的效果受到嚴格限制。

解決方案: 要保留範例 2 中 OUTER JOIN 的行為,請將 INNER JOIN 改為 LEFT JOIN

<code class="language-sql">SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
LEFT JOIN city ON address.city_id = city.id;</code>
登入後複製

最佳實務:

  • 雖然不是嚴格要求,但將 INNER JOIN 放在 OUTER JOIN 之前可以提高可讀性,因為 INNER JOIN 代表更嚴格的條件。
  • 請謹慎使用 RIGHT JOIN,因為它們可能不如 LEFT JOIN 直覺。 通常,交換表格的 LEFT JOIN 會更清楚地達到相同的結果。

理解 INNER JOINOUTER JOIN 之間的交互作用對於編寫高效且正確的 SQL 查詢至關重要。 仔細考慮所有連接的 ON 子句,以確保它們符合所需的行為。

以上是SQL 中 INNER JOIN 是否會覆寫前面的 OUTER JOIN?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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