NULL 代表「未知值」,非空字串、非零、非空集合。
關鍵特性:NULL = NULL 結果為 UNKNOWN(非 TRUE),任何與 NULL 比較(=, <>, >, <)皆回傳 UNKNOWN。
CREATE TABLE Test_NULL (
num INT NOT NULL PRIMARY KEY,
fname NVARCHAR(50) NULL,
lname NVARCHAR(50) NULL
);
INSERT INTO Test_NULL VALUES (1, 'Tom', 'Jane');
INSERT INTO Test_NULL VALUES (2, 'Dave', ''); -- 空字串
INSERT INTO Test_NULL (num, fname) VALUES (3, 'Aaron'); -- lname = NULL
INSERT INTO Test_NULL (num, fname) VALUES (4, 'Betty'); -- lname = NULL
| 意圖 | 錯誤寫法 | 正確寫法 |
|---|---|---|
| 找出 lname 為 NULL | WHERE lname = NULL | WHERE lname IS NULL |
| 找出 lname 不為 NULL | WHERE lname <> NULL | WHERE lname IS NOT NULL |
| 找出 lname 為空字串 | WHERE lname = ''(正確) | WHERE lname = '' |
| 將 NULL 顯示為預設值 | 無 | ISNULL(lname, 'N/A') 或 COALESCE(lname, 'N/A') |
預設 SET ANSI_NULLS ON(SQL Server 預設),上述規則生效。
若 SET ANSI_NULLS OFF,則 = NULL 可匹配 NULL 值,但強烈不建議關閉,因:
許多人以為「可變長欄位 NULL 不佔空間,固定長度佔空間」。實際上兩者皆佔用空間:
INT)額外佔用定義長度位元組(4 bytes)。VARCHAR、NVARCHAR)不佔用資料區位元組,但仍佔用 NULL Bitmap 1 bit + 位移陣列 2 bytes。INSERT INTO Test_NULL (num, fname, lname) VALUES (5, 'Serena', NULL); UPDATE Test_NULL SET fname = NULL WHERE num = 2;
IS NULL / IS NOT NULL 判斷。NOT NULL + 預設值,避免三值邏輯陷阱。NOT NULL,提升統計資訊準確度與查詢效能。