WHERE 子句用於從資料表中篩選符合條件的資料列。它是 SELECT、UPDATE、DELETE 等指令的核心,決定操作影響的範圍。
SELECT column_name, column_name FROM table_name WHERE column_name operator value;
operator 為比較運算子(=、<>、>、< 等)。AND、OR、NOT 形成複合條件。+----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘寶 | https://www.taobao.com/ | 13 | CN | | 3 | 菜鳥教程 | https://www.runoob.com/ | 4689 | CN | | 4 | 微博 | https://weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 3 | USA | +----+--------------+---------------------------+-------+---------+
SELECT * FROM Websites WHERE country = 'CN';
輸出結果:

回傳淘寶、菜鳥教程、微博 3 筆。
SELECT * FROM Websites WHERE id = 1;
輸出結果:

關鍵差異: 文字值需單引號 'CN',數值不加引號 1。加引號可能導致隱含轉型與索引失效。
| 運算子 | 描述 | 範例 |
|---|---|---|
= | 等於 | id = 1 |
<> / != | 不等於 | status <> 'deleted' |
> | 大於 | alexa > 100 |
< | 小於 | price < 500 |
>= | 大於等於 | age >= 18 |
<= | 小於等於 | stock <= 10 |
BETWEEN | 範圍內(含邊界) | created_at BETWEEN '2024-01-01' AND '2024-12-31' |
LIKE | 模式匹配 | name LIKE 'Google%' |
IN | 多值匹配 | country IN ('CN', 'US') |
IS NULL | 為 NULL | deleted_at IS NULL |
IS NOT NULL | 不為 NULL | email IS NOT NULL |
EXISTS | 子查詢存在 | EXISTS (SELECT 1 FROM orders WHERE user_id = u.id) |
'text',大小寫敏感度視 Collation。'2024-01-01',格式建議 ISO 8601 YYYY-MM-DD。SELECT * FROM Products WHERE category_id IN (SELECT id FROM Categories WHERE parent_id = 0);
子查詢回傳單欄位結果集作為 IN 清單,動態決定過濾條件。
SARGable(Search ARGument Able)條件可利用索引搜尋。反例:
WHERE YEAR(created_at) = 2024 → 函數運算導致全表掃描。改為 WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01'。WHERE col + 1 > 10 → 運算導致索引失效。改為 WHERE col > 9。WHERE UPPER(name) = 'GOOGLE' → 改用 WHERE name = 'Google' COLLATE utf8mb4_bin 或功能索引。原則:讓欄位「裸露」在運算子左側,右側為常數/參數。