在 SQL 中,= 和 IS 是兩個看似相似但用途不同的比較運算符。
許多初學者容易混淆它們的使用場景,特別是在處理 NULL 值時。
本篇文章將深入探討 = 與 IS 的差異、各自的適用時機,以及如何避免常見的錯誤。
= 運算符:用於一般值的比較
= 是 SQL 中的「等於」運算符,主要用於比較兩個具體的值。如果兩個值相等,則條件為 TRUE,否則為 FALSE。
= 的使用範例
假設有一個 Users 表,其中存放用戶的基本資訊:
CREATE TABLE Users (
UserID INT PRIMARY KEY,
Name VARCHAR(50),
Age INT
);
並插入一些測試數據:
INSERT INTO Users (UserID, Name, Age) VALUES (1, 'Alice', 25);
INSERT INTO Users (UserID, Name, Age) VALUES (2, 'Bob', 30);
INSERT INTO Users (UserID, Name, Age) VALUES (3, 'Charlie', NULL);如果要查詢年齡為 25 的用戶,則可以使用 =:
SELECT * FROM Users WHERE Age = 25;結果:
| UserID | Name | Age |
|---|---|---|
| 1 | Alice | 25 |
這樣的查詢沒有問題,因為 Age = 25 是一個有效的比較。
IS 運算符:用於 NULL 值的比較
在 SQL 中,NULL 代表「未知」或「不存在」的值。
= 無法與 NULL 直接比較,因為 NULL 並不是一個確定的值,因此 NULL = NULL 也不會返回 TRUE,而是 UNKNOWN。
錯誤示範:使用 = 來比較 NULL
如果你嘗試查詢 Age 為 NULL 的用戶:
SELECT * FROM Users WHERE Age = NULL;
結果: 👉 此查詢不會返回任何結果! 因為 NULL = NULL 並不會返回 TRUE,而是 UNKNOWN,導致 SQL 無法匹配這條記錄。
正確做法:使用 IS NULL
若要查詢 Age 為 NULL 的用戶,應該使用 IS 運算符:
SELECT * FROM Users WHERE Age IS NULL;結果:
| UserID | Name | Age |
|---|---|---|
| 3 | Charlie | NULL |
這樣才能正確地篩選出 NULL 值。
何時使用 IS,何時使用 =?
| 運算符 | 使用時機 | 範例 |
|---|---|---|
= | 比較確定的值(數字、文字、日期等) | SELECT * FROM Users WHERE Age = 25; |
IS | 檢查 NULL 值 | SELECT * FROM Users WHERE Age IS NULL; |
若要查詢 Age 不為 NULL 的用戶,應該使用:
SELECT * FROM Users WHERE Age IS NOT NULL;這樣可以篩選出 Age 有具體數值的記錄。
延伸學習:NULL 值對比陷阱
NULL 在 IN 運算符中的影響
考慮以下查詢:
SELECT * FROM Users WHERE Age IN (25, NULL);你可能會以為這會找到 Age = 25 或 Age = NULL 的用戶,但實際上 NULL 會導致不確定性,因此 SQL 只會返回 Age = 25 的記錄,而不會匹配 NULL 值。
若要正確查詢包含 NULL 的條件,應該使用:
SELECT * FROM Users WHERE Age IN (25) OR Age IS NULL;NULL 在 DISTINCT、GROUP BY 和 COUNT 的影響
DISTINCT
在 DISTINCT 查詢時,NULL 會被視為同一個未知值:
SELECT DISTINCT Age FROM Users;若 Users 表有多個 NULL,結果仍只會顯示一個 NULL。
GROUP BY
在 GROUP BY 查詢時,所有 NULL 值會被歸類到同一組:
SELECT Age, COUNT(*) FROM Users GROUP BY Age;會成為一個單獨的分類。
COUNT
COUNT(*) 計算所有行數,而 COUNT(Age) 只會計算非 NULL 的行數:
SELECT COUNT(*) FROM Users; -- 計算所有用戶數
SELECT COUNT(Age) FROM Users; -- 只計算 Age 不為 NULL 的數據結語
在 SQL 中,= 用於比較確定的值,而 IS 專門用於檢查 NULL。
當處理數據時,務必要正確使用這些運算符,以避免無法篩選出 NULL 值的錯誤。
本篇文章希望幫助你更好地理解 IS 和 = 的差異,讓你的 SQL 查詢更準確、更高效! 🚀