WHERE 子句是 SQL 數據過濾的核心,用於 SELECT、UPDATE、DELETE 等語句中限定操作數據範圍。本文系統整理 MySQL 支援的所有比較、邏輯、模糊匹配運算符,解析優先級規則,提供豐富實戰範例。
SELECT column_list FROM table_name WHERE condition;
UPDATE table_name SET col=val WHERE condition;
DELETE FROM table_name WHERE condition;
condition:返回 TRUE 的表達式,可組合多個條件| 運算符 | 含義 | 範例 | 備註 |
|---|---|---|---|
= | 等於 | age = 25 | |
!= / <> | 不等於 | status != 'deleted' | <> 為 SQL 標準 |
> | 大於 | price > 100 | |
< | 小於 | stock < 10 | |
>= | 大於等於 | created_at >= '2023-01-01' | |
<= | 小於等於 | score <= 60 | |
BETWEEN ... AND ... | 範圍內(含邊界) | age BETWEEN 18 AND 60 | 等價於 age >= 18 AND age <= 60 |
NOT BETWEEN ... AND ... | 範圍外 | age NOT BETWEEN 18 AND 60 | |
IN (val1, val2, ...) | 在列表中 | city IN ('北京','上海','深圳') | 優化器可轉為多個 OR |
NOT IN (...) | 不在列表中 | id NOT IN (1,2,3) | 含 NULL 時結果為空,慎用 |
IS NULL | 為 NULL | deleted_at IS NULL | = NULL 永遠為 FALSE |
IS NOT NULL | 不為 NULL | email IS NOT NULL | |
LIKE | 模糊匹配 | name LIKE '張%' | 配合 % _ 通配符 |
NOT LIKE | 不匹配 | name NOT LIKE '%test%' | |
REGEXP / RLIKE | 正則匹配 | phone REGEXP '^1[3-9]\\d{9}$' | MySQL 8.0 支援 ICU 正則 |
| 運算符 | 含義 | 優先級 | 範例 |
|---|---|---|---|
NOT / ! | 邏輯非 | 1 (最高) | NOT active |
AND / && | 邏輯與 | 2 | age > 18 AND status = 1 |
OR / || | 邏輯或 | 3 (最低) | vip = 1 OR score > 90 |
優先級規則:NOT > AND > OR,建議使用括號 () 明確邏輯分組。
%:匹配任意長度字符(含 0 個)_:匹配單個字符LIKE '%\\_%' ESCAPE '\\' 查詢包含下劃線的字符串
-- 用戶名精確查詢
SELECT * FROM users WHERE username = 'Jack';
-- 多狀態過濾
SELECT * FROM orders WHERE status IN ('paid', 'shipped', 'completed');
-- 2023 年註冊用戶
SELECT uid, username FROM users
WHERE reg_date >= '2023-01-01' AND reg_date < '2024-01-01';
-- 年齡段分析
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
-- 包含關鍵字
SELECT * FROM products WHERE name LIKE '%手機%';
-- 以特定前綴開頭(可用索引)
SELECT * FROM users WHERE username LIKE 'admin%';
-- 正則:手機號驗證
SELECT * FROM users WHERE phone REGEXP '^1[3-9]\\d{9}$';
-- 未填寫郵箱的用戶
SELECT * FROM users WHERE email IS NULL OR email = '';
-- 軟刪除查詢
SELECT * FROM articles WHERE deleted_at IS NULL;
-- ❌ 錯誤:OR 優先級低,實際邏輯為 (status=1 AND type=A) OR type=B
SELECT * FROM tasks WHERE status = 1 AND type = 'A' OR type = 'B';
-- ✅ 正確:明確分組
SELECT * FROM tasks WHERE status = 1 AND (type = 'A' OR type = 'B');
-- 復雜業務:高價值活躍用戶
SELECT * FROM users
WHERE (vip_level >= 3 OR total_spent > 10000)
AND last_login > DATE_SUB(NOW(), INTERVAL 30 DAY)
AND status = 'active';
col = val、col IN (...)、col > val、col LIKE 'prefix%'WHERE DATE(created_at) = '2023-01-01' → WHERE created_at >= '2023-01-01' AND created_at < '2023-01-02'NOT EXISTS 或 LEFT JOIN ... IS NULLUNION ALL 分開查詢再合併,各走各的索引| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
WHERE col = NULL | 永遠為 FALSE | WHERE col IS NULL |
WHERE col != NULL | 永遠為 FALSE | WHERE col IS NOT NULL |
WHERE col NOT IN (1, NULL) | 結果為空集 | WHERE col NOT IN (1) AND col IS NOT NULL |
WHERE name LIKE '%_%' | 匹配含下劃線,非「至少一字符」 | WHERE name LIKE '%\\_%' ESCAPE '\\' |
WHERE a=1 OR b=2 AND c=3 | 實際為 a=1 OR (b=2 AND c=3) | WHERE (a=1 OR b=2) AND c=3 |
掌握 WHERE 子句的運算符語義、優先級規則、索引友好模式,是編寫高性能、正確 SQL 的基石。建議在 Code Review 時重點檢查空值處理、優先級分組、LIKE 通配符位置三大高發錯誤區。