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中文網其他相關文章!