理解 NULL 和 NOT IN
子句
與 NOT IN
相比,使用 LEFT JOIN
子句時經常會出現不一致,尤其是在處理 NULL
值時。 讓我們用兩個範例查詢來檢查一下:
查詢A:
<code class="language-sql">SELECT 'true' WHERE 3 IN (1, 2, 3, NULL);</code>
查詢 B:
<code class="language-sql">SELECT 'true' WHERE 3 NOT IN (1, 2, NULL);</code>
查詢 A 產生結果,而查詢 B 則不產生結果。 這種差異源自於 SQL 如何處理涉及 NULL
值的比較。
剖析查詢
讓我們分解每個查詢以了解其行為:
查詢 A:
這個查詢可以簡化為:
<code class="language-sql">SELECT 'true' WHERE 3 = 1 OR 3 = 2 OR 3 = 3 OR 3 = NULL;</code>
因為 3 = 3
的計算結果是 TRUE
,所以查詢回傳結果。
查詢 B:
此查詢簡化為:
<code class="language-sql">SELECT 'true' WHERE 3 != 1 AND 3 != 2 AND 3 != NULL;</code>
啟用 ANSI_NULLS
(大多數 SQL 資料庫中的預設設定)時,3 != NULL
的計算結果為 UNKNOWN
。 帶有 AND
的 UNKNOWN
條件會導致整個謂詞為 UNKNOWN
,導致不傳回任何行。
如果 ANSI_NULLS
被停用,3 != NULL
的計算結果為 TRUE
,可能會傳回一行。
結論
由於 SQL 的三值邏輯(TRUE、FALSE、UNKNOWN)以及 NULL
的設置,NOT IN
子句中 ANSI_NULLS
值的存在會顯著影響查詢結果。 在使用 NULL
值時,了解這種行為至關重要,以避免意外結果。 在這種情況下,使用 LEFT JOIN
和 IS NULL
檢查通常可以為處理 NULL
值提供更可靠的替代方案。
以上是NULL 值如何影響 NOT IN 子句的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!