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

MySQL WHERE 子句完全指南:條件篩選、運算子大全、BINARY 大小寫敏感與 PHP 實戰

     編輯:MySQL 入門

MySQL WHERE 子句完全指南:條件篩選、運算子大全、BINARY 大小寫敏感與 PHP 實戰

WHERE 是 SQL 查詢的「守門員」——它決定哪些行參與後續的投影、排序、聚合、連接。掌握 WHERE 的運算子、優先級、索引利用技巧,是寫出高效 SQL 的基石。

核心語法

SELECT column_list
FROM table_name
[WHERE condition1 [AND|OR condition2 ...]];
  • 可用於 SELECT、UPDATE、DELETE。
  • 支援多表查詢(舊式逗號連接或 JOIN ON)。
  • 條件可為比較、邏輯、範圍、模糊、空值、子查詢等組合。

比較運算子完整表(假設 A=10, B=20)

運算子 描述 範例結果
=等於(A = B) → false
<>, !=不等於(A != B) → true
>大於(A > B) → false
<小於(A < B) → true
>=大於等於(A >= B) → false
<=小於等於(A <= B) → true
BETWEEN ... AND ...範圍內(含邊界)5 BETWEEN 1 AND 10 → true
IN (val1, val2...)集合成員5 IN (1,3,5) → true
LIKE pattern模糊匹配'abc' LIKE 'a%' → true
IS NULL / IS NOT NULL空值判斷NULL IS NULL → true
<=>NULL 安全等於NULL <=> NULL → true

邏輯運算子與優先級

  • NOT > AND > OR
  • 建議明確加括號 避免歧義:WHERE (a=1 OR a=2) AND b>10
  • AND 短路:前條件 false 直接跳過後條件評估。

命令列實戰:runoob_tbl 表

精確匹配:作者為 Sanjay

mysql> SELECT * FROM runoob_tbl WHERE runoob_author = 'Sanjay';
+-------------+----------------+-----------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 3 | JAVA Tutorial | Sanjay | 2007-05-21 |
+-------------+----------------+-----------------+-----------------+

大小寫敏感查詢:BINARY 關鍵字

預設 utf8mb4_general_ci 不區分大小寫。強制區分:

mysql> SELECT * FROM runoob_tbl WHERE BINARY runoob_author = 'sanjay';
Empty set (0.02 sec) -- 小寫 sanjay 無匹配

複合條件:ID 為 1 或 2,且標題含 "Learn"

mysql> SELECT * FROM runoob_tbl
    -> WHERE runoob_id IN (1,2) AND runoob_title LIKE '%Learn%';

PHP 實戰:動態條件建構 + 預處理

<?php
$author = $_GET['author'] ?? '';
$id_min = (int)($_GET['id_min'] ?? 0);

$conditions = [];
$params = [];
$types = '';

if ($author !== '') {
    $conditions[] = 'runoob_author = ?';
    $params[] = $author;
    $types .= 's';
}
if ($id_min > 0) {
    $conditions[] = 'runoob_id >= ?';
    $params[] = $id_min;
    $types .= 'i';
}

$where = $conditions ? 'WHERE ' . implode(' AND ', $conditions) : '';
$sql = "SELECT runoob_id, runoob_title, runoob_author, submission_date
        FROM runoob_tbl $where";

$stmt = mysqli_prepare($conn, $sql);
if ($params) {
    mysqli_stmt_bind_param($stmt, $types, ...$params);
}
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);

while ($row = mysqli_fetch_assoc($result)) {
    echo "{$row['runoob_id']}: {$row['runoob_title']} by {$row['runoob_author']}<br>";
}
?>

效能優化:讓 WHERE 用上索引

  1. 避免函數包裹索引欄: WHERE YEAR(date_col) = 2024 → WHERE date_col >= '2024-01-01' AND date_col < '2025-01-01'
  2. 避免隱式轉型: WHERE varchar_col = 123 導致全表掃描,改為 WHERE varchar_col = '123'
  3. 最左前綴原則: 複合索引 INDEX (a,b,c) 支援 WHERE a=1、WHERE a=1 AND b=2,不支援 WHERE b=2。
  4. 範圍查詢後的列無法用索引: WHERE a=1 AND b>2 AND c=3 中 c 用不上索引。
  5. IS NULL/IS NOT NULL 可用索引: MySQL 5.6+ 支援。

常見誤區

  • WHERE col = NULL 永遠不匹配 → 必用 IS NULL
  • WHERE col != 'val' 不包含 NULL 行 → 需 WHERE col != 'val' OR col IS NULL
  • 字串比較預設不區分大小寫 → 需 BINARY 或 COLLATE ..._bin

WHERE 子句看似簡單,實則藏著索引利用、型別轉換、三值邏輯(TRUE/FALSE/UNKNOWN)等深層機制。精準構建條件、善用 EXPLAIN 驗證執行計畫,是 SQL 調優的起點也是終點。

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