在 SQL 查詢中,NULL 代表「未知」或「不存在」,而非零值或空字串。這一特性導致 NULL 與任何值(包括 NULL 本身)進行比較,結果永遠為 false。因此,WHERE column = NULL 或 WHERE column != NULL 永遠不會返回任何資料列——這是新手最常踩的坑。
| 操作符 | 用途與回傳值 |
|---|---|
| IS NULL | 欄位值為 NULL 時回傳 TRUE |
| IS NOT NULL | 欄位值不為 NULL 時回傳 TRUE |
| <=> | 安全比較操作符(NULL-safe equal)。兩側皆為 NULL 時回傳 TRUE,否則等同於 = |
建立測試表並插入包含 NULL 的資料:
mysql> CREATE TABLE tcount_tbl (
-> runoob_author VARCHAR(40) NOT NULL,
-> runoob_count INT
-> );
mysql> INSERT INTO tcount_tbl VALUES ('mahran', 20), ('mahnaz', NULL), ('Jen', NULL), ('Gill', 20);
mysql> SELECT * FROM tcount_tbl WHERE runoob_count = NULL; Empty set (0.00 sec) mysql> SELECT * FROM tcount_tbl WHERE runoob_count != NULL; Empty set (0.01 sec)
mysql> SELECT * FROM tcount_tbl WHERE runoob_count IS NULL; +-----------------+----------------+ | runoob_author | runoob_count | +-----------------+----------------+ | mahnaz | NULL | | Jen | NULL | +-----------------+----------------+ mysql> SELECT * FROM tcount_tbl WHERE runoob_count IS NOT NULL; +-----------------+----------------+ | runoob_author | runoob_count | +-----------------+----------------+ | mahran | 20 | | Gill | 20 | +-----------------+----------------+
mysql> SELECT * FROM tcount_tbl WHERE runoob_count <=> NULL; -- 等同於 IS NULL,回傳 mahnaz、Jen 兩筆資料 mysql> SELECT * FROM tcount_tbl WHERE runoob_count <=> 20; -- 回傳 mahran、Gill 兩筆資料
在 PHP 中切勿直接將變數插入 SQL 字串比較 NULL,應先判斷變數是否為 null,再動態組裝 IS NULL 或 = ? 條件,並使用預處理語句防止注入:
<?php
$count = $_POST['runoob_count'] ?? null;
$sql = "SELECT runoob_author, runoob_count FROM tcount_tbl WHERE ";
$params = [];
$types = '';
if ($count === null) {
$sql .= "runoob_count IS NULL";
} else {
$sql .= "runoob_count = ?";
$params[] = $count;
$types .= 'i';
}
// 使用 mysqli 預處理執行...
?>
= NULL、!= NULL、<> NULL。IS NULL,排除 NULL 用 IS NOT NULL。<=>。掌握這三大操作符,即可從容應對所有 NULL 相關查詢場景,告別「明明有資料卻查不出來」的困擾。