WHERE 是 SQL 查詢的「守門員」——它決定哪些行參與後續的投影、排序、聚合、連接。掌握 WHERE 的運算子、優先級、索引利用技巧,是寫出高效 SQL 的基石。
SELECT column_list FROM table_name [WHERE condition1 [AND|OR condition2 ...]];
SELECT、UPDATE、DELETE。| 運算子 | 描述 | 範例結果 |
|---|---|---|
= | 等於 | (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 |
WHERE (a=1 OR a=2) AND b>10AND 短路:前條件 false 直接跳過後條件評估。mysql> SELECT * FROM runoob_tbl WHERE runoob_author = 'Sanjay'; +-------------+----------------+-----------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-------------+----------------+-----------------+-----------------+ | 3 | JAVA Tutorial | Sanjay | 2007-05-21 | +-------------+----------------+-----------------+-----------------+
預設 utf8mb4_general_ci 不區分大小寫。強制區分:
mysql> SELECT * FROM runoob_tbl WHERE BINARY runoob_author = 'sanjay'; Empty set (0.02 sec) -- 小寫 sanjay 無匹配
mysql> SELECT * FROM runoob_tbl
-> WHERE runoob_id IN (1,2) AND runoob_title LIKE '%Learn%';
<?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 YEAR(date_col) = 2024 → WHERE date_col >= '2024-01-01' AND date_col < '2025-01-01'WHERE varchar_col = 123 導致全表掃描,改為 WHERE varchar_col = '123'INDEX (a,b,c) 支援 WHERE a=1、WHERE a=1 AND b=2,不支援 WHERE b=2。WHERE a=1 AND b>2 AND c=3 中 c 用不上索引。WHERE col = NULL 永遠不匹配 → 必用 IS NULLWHERE col != 'val' 不包含 NULL 行 → 需 WHERE col != 'val' OR col IS NULLBINARY 或 COLLATE ..._binWHERE 子句看似簡單,實則藏著索引利用、型別轉換、三值邏輯(TRUE/FALSE/UNKNOWN)等深層機制。精準構建條件、善用 EXPLAIN 驗證執行計畫,是 SQL 調優的起點也是終點。