首頁 >資料庫 >mysql教程 >為什麼 MySQL 的'NOT IN”會因跨多個表的 NULL 而失敗,以及如何修復它?

為什麼 MySQL 的'NOT IN”會因跨多個表的 NULL 而失敗,以及如何修復它?

Barbara Streisand
Barbara Streisand原創
2024-12-26 14:40:10458瀏覽

Why Does MySQL's

MySQL 跨三表的“NOT IN”查詢:陷阱和解決方案

在MySQL 中,“NOT IN”運算符通常用於檢索指定表中不存在的記錄。但是,在使用多個表格時,重要的是要意識到其潛在的陷阱。

「NOT IN」可能導致意外結果的一種情況是正在搜尋的表可能包含 NULL 值。在比較「等級」和「評估」表中的資料的查詢中遇到此問題。該查詢旨在識別“grade”中與“evaluation”中的任何條目都不匹配的記錄,但如果兩個表中均不存在名稱“JOHN”,則無法傳回任何結果。

要避免這種情況問題,建議使用替代方法,例如 NOT EXISTS 或左連接,而不是“NOT IN”。這些方法不會受到 NULL 值破壞查詢的影響。

此外,建議使用明確聯接,而不是使用 WHERE 子句聯接表的舊語法。顯式聯接提供了更高的清晰度並避免潛在的效能問題。

為了進一步說明處理 NULL 值時「NOT IN」的缺點,請考慮以下範例:

表格結構:

區塊1:

預期結果: 3 行(如預期)

區塊2:

意想不到的結果:

沒有回傳任何行

這種意外行為是由 MySQL 使用的三值邏輯引起的。當涉及 NULL 值時,查詢將轉換為:

,相當於:

由於表達式「status=NULL」的計算結果為UNKNOWN,因此整個表達式變為未知,並且所有行都被過濾

解決方案:

要避免此問題,請使用左連接或NOT EXISTS 等替代方法:

以上是為什麼 MySQL 的'NOT IN”會因跨多個表的 NULL 而失敗,以及如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn