SELECT column_list FROM table_name WHERE condition;
UPDATE table_name SET col=val WHERE condition;
DELETE FROM table_name WHERE condition;
condition 為有效表達式,指定資料必須滿足的條件。
| 運算符 | 說明 | 範例 |
|---|---|---|
= | 等於 | WHERE status = 1 |
!= / <> | 不等於 | WHERE status != 0 |
> | 大於 | WHERE age > 18 |
< | 小於 | |
>= | 大於或等於 | WHERE score >= 60 |
<= | 小於或等於 | WHERE qty <= 10 |
BETWEEN ... AND ... | 範圍內(含邊界) | WHERE age BETWEEN 20 AND 30 |
NOT BETWEEN ... AND ... | 不在範圍內 | WHERE age NOT BETWEEN 20 AND 30 |
IN (val1, val2, ...) | 在列舉值中 | WHERE city IN ('Taipei','Taichung') |
NOT IN (...) | 不在列舉值中 | WHERE status NOT IN (0,-1) |
LIKE | 模式匹配 | WHERE name LIKE 'John%' |
NOT LIKE | 不匹配模式 | WHERE email NOT LIKE '%@spam.com' |
IS NULL | 空值判斷 | WHERE deleted_at IS NULL |
IS NOT NULL | 非空判斷 | WHERE email IS NOT NULL |
AND | 邏輯與 | WHERE a=1 AND b=2 |
OR | 邏輯或 | WHERE a=1 OR b=2 |
NOT | 邏輯非 | WHERE NOT (a=1 AND b=2) |
%:匹配任意長度字串(含 0 字元)WHERE name LIKE '%son' → Johnson, Wilson, Son_:匹配單一字元WHERE code LIKE '_ _ _' → 正好 3 字元WHERE path LIKE '%/_%' ESCAPE '/' → 字面匹配 _NOTANDOR建議:明確使用括號 避免歧義,如 WHERE (a=1 OR a=2) AND b=3。
-- 精確匹配
SELECT * FROM user WHERE username = 'Jack';
-- 日期範圍
SELECT uid, username FROM user WHERE regdate >= UNIX_TIMESTAMP('2009-01-01');
-- 模糊搜尋
SELECT * FROM user WHERE username LIKE '%user%';
-- 多條件 OR
SELECT * FROM user WHERE username LIKE '%user%' OR username LIKE '%admin%';
-- 複合條件
SELECT * FROM orders
WHERE status IN ('paid','shipped')
AND created_at BETWEEN '2024-01-01' AND '2024-12-31'
AND user_id IS NOT NULL;
LIKE 'prefix%' 可用索引;LIKE '%suffix' 或 LIKE '%mid%' 導致全表掃描IN 列表過長(>1000)效能下降,考慮臨時表或 JOINIS NULL 可用索引;!=、NOT IN、NOT LIKE 通常無法用索引WHERE a=1 AND b=2 用到 idx(a,b);WHERE b=2 用不到WHERE 子句是 SQL 資料篩選的核心。熟練掌握運算符語義、優先級、索引友好度,能寫出正確且高效的查詢。實務上:多用括號、慎用否定條件、善用覆蓋索引。