| 運算子 | 說明 |
| =, <>, != | 等於、不等於 |
| >, <, >=, <= | 大小比較 |
| IS NULL / IS NOT NULL | NULL 判斷 |
| BETWEEN ... AND ... | 區間含邊界 |
| IN (val1, val2...) | 集合包含 |
| LIKE 'pattern' | 模糊比對,% 多字元、_ 單字元 |
邏輯運算子優先序
NOT > AND > OR,善用括號明確優先序。
3. 排序 ORDER BY
SELECT col1, col2 FROM t ORDER BY col1 ASC, col2 DESC;
-- 可用別名、位置編號 (不建議)
NULL 值預設排在最前 (ASC) 或最後 (DESC),可用 ORDER BY IS NULL, col 控制。
4. 分頁 LIMIT
LIMIT 10 -- 前 10 筆
LIMIT 10 OFFSET 20 -- 跳過 20 筆取 10 筆 (第 3 頁)
LIMIT 20, 10 -- 同義寫法
深分頁優化:WHERE id > last_id ORDER BY id LIMIT 10。
5. 聚合與分組 GROUP BY / HAVING
SELECT dept, COUNT(*) AS cnt, AVG(salary) AS avg_sal
FROM emp
GROUP BY dept
HAVING cnt > 5
ORDER BY avg_sal DESC;
HAVING 可用聚合別名,WHERE 不可。
GROUP BY 隱含排序 (MySQL 5.7 前),8.0+ 需顯式 ORDER BY。
6. 去重 DISTINCT
SELECT DISTINCT dept FROM emp;
SELECT COUNT(DISTINCT dept) FROM emp;
7. 多表查詢 JOIN
INNER JOIN:交集。
LEFT/RIGHT JOIN:左/右表全保留。
CROSS JOIN:笛卡兒積。
- 條件寫在
ON,篩選寫在 WHERE。
8. 子查詢與 CTE (8.0+)
-- 子查詢
SELECT * FROM t1 WHERE id IN (SELECT id FROM t2 WHERE status=1);
-- CTE 更易讀
WITH active AS (SELECT id FROM t2 WHERE status=1)
SELECT * FROM t1 WHERE id IN (SELECT id FROM active);
9. 使用者變量
SELECT @max_id := MAX(id) FROM t1;
SELECT * FROM t1 WHERE id = @max_id;
會話級、連線隔離,適合簡單狀態傳遞。
10. 統計分析實戰
-- 各部門人數、平均薪資、最高薪資
SELECT dept,
COUNT(*) AS cnt,
AVG(salary) AS avg_sal,
MAX(salary) AS max_sal
FROM emp
GROUP BY dept
ORDER BY cnt DESC
LIMIT 5;
避坑清單
- 避免
SELECT *。
- 索引欄位不加函數、不隱含轉換。
NOT IN 子查詢含 NULL 會回空集,改用 NOT EXISTS。
OR 條件跨欄位導致索引失效,改用 UNION ALL。
- 大表
COUNT(*) 慢,用 EXPLAIN 估算或維護計數表。
copyright ©
萬盛學電腦網 all rights reserved