首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL WHERE 條件子句完整指南:運算符、優先級與實戰範例

     編輯:MySQL 綜合教學

前言

WHERE 子句是 SQL 數據過濾的核心,用於 SELECT、UPDATE、DELETE 等語句中限定操作數據範圍。本文系統整理 MySQL 支援的所有比較、邏輯、模糊匹配運算符,解析優先級規則,提供豐富實戰範例。

一、WHERE 語法基礎


SELECT column_list FROM table_name WHERE condition;
UPDATE table_name SET col=val WHERE condition;
DELETE FROM table_name WHERE condition;
  • condition:返回 TRUE 的表達式,可組合多個條件
  • 非零、非 NULL 結果視為 TRUE

二、運算符完整分類表

1. 比較運算符

運算符含義範例備註
=等於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為 NULLdeleted_at IS NULL= NULL 永遠為 FALSE
IS NOT NULL不為 NULLemail 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 正則

2. 邏輯運算符

運算符含義優先級範例
NOT / !邏輯非1 (最高)NOT active
AND / &&邏輯與2age > 18 AND status = 1
OR / ||邏輯或3 (最低)vip = 1 OR score > 90

優先級規則:NOT > AND > OR,建議使用括號 () 明確邏輯分組。

3. 通配符詳解

  • %:匹配任意長度字符(含 0 個)
  • _:匹配單個字符
  • 轉義:LIKE '%\\_%' ESCAPE '\\' 查詢包含下劃線的字符串

三、實戰範例庫

1. 精確匹配


-- 用戶名精確查詢
SELECT * FROM users WHERE username = 'Jack';

-- 多狀態過濾
SELECT * FROM orders WHERE status IN ('paid', 'shipped', 'completed');

2. 範圍查詢


-- 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;

3. 模糊搜索


-- 包含關鍵字
SELECT * FROM products WHERE name LIKE '%手機%';

-- 以特定前綴開頭(可用索引)
SELECT * FROM users WHERE username LIKE 'admin%';

-- 正則:手機號驗證
SELECT * FROM users WHERE phone REGEXP '^1[3-9]\\d{9}$';

4. 空值處理


-- 未填寫郵箱的用戶
SELECT * FROM users WHERE email IS NULL OR email = '';

-- 軟刪除查詢
SELECT * FROM articles WHERE deleted_at IS NULL;

5. 複合條件(注意優先級)


-- ❌ 錯誤: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';

四、性能優化提示

  1. 索引友好寫法:col = val、col IN (...)、col > val、col LIKE 'prefix%'
  2. 避免函數包裹列:WHERE DATE(created_at) = '2023-01-01' → WHERE created_at >= '2023-01-01' AND created_at < '2023-01-02'
  3. NOT IN 陷阱:子查詢或列表含 NULL 導致全表掃描,改用 NOT EXISTS 或 LEFT JOIN ... IS NULL
  4. OR 條件優化:多列 OR 可用 UNION ALL 分開查詢再合併,各走各的索引

五、常見錯誤對照表

錯誤寫法問題正確寫法
WHERE col = NULL永遠為 FALSEWHERE col IS NULL
WHERE col != NULL永遠為 FALSEWHERE 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 通配符位置三大高發錯誤區。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved