SELECT 選項參數速查
| 選項 | 作用 |
| ALL | 返回所有匹配行(默認) |
| DISTINCT / DISTINCTROW | 去除結果集重複行 |
| HIGH_PRIORITY | 提升查詢優先級 |
| STRAIGHT_JOIN | 強制按 FROM 順序連接 |
| SQL_SMALL_RESULT | 結果集小,用臨時表避免排序 |
| SQL_BIG_RESULT | 結果集大,優先排序 |
| SQL_BUFFER_RESULT | 結果放入臨時表,早釋放鎖 |
| SQL_CACHE / SQL_NO_CACHE | 控制查詢緩存 |
| SQL_CALC_FOUND_ROWS | 忽略 LIMIT 計算總行數,配合 FOUND_ROWS() |
聚合函數 (Aggregation Functions)
| 函數 | 說明 | 忽略 NULL |
| COUNT(expr) / COUNT(*) | 行數 / 非NULL值數 | 是 / 否(*) |
| SUM(expr) | 求和 | 是 |
| AVG(expr) | 平均值 | 是 |
| MAX(expr) / MIN(expr) | 最大/最小值 | 是 |
| STDDEV(expr) / STD(expr) | 標準差 | 是 |
| VARIANCE(expr) | 方差 | 是 |
| GROUP_CONCAT(expr) | 分組拼接字符串,默認 1024 字節上限 | 是 |
| BIT_AND / BIT_OR / BIT_XOR | 位運算聚合 | 是 |
COUNT 變體差異
COUNT(*) -- 統計所有行(含 NULL)
COUNT(col) -- 統計該列非 NULL 行
COUNT(DISTINCT col) -- 去重後統計非 NULL 行
GROUP_CONCAT 實用參數
GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR ','])
-- 調大長度限制
SET SESSION group_concat_max_len = 1000000;
GROUP BY 分組查詢
SELECT major, COUNT(*) AS stu_cnt, AVG(credits) AS avg_credits
FROM student
GROUP BY major;
WITH ROLLUP 超級聚合
SELECT major, gender, COUNT(*) AS cnt
FROM student
GROUP BY major, gender WITH ROLLUP;
-- 輸出:各專業+性別分組 → 各專業小計( gender=NULL ) → 總計( major=NULL, gender=NULL )
HAVING 過濾分組
⚠️ WHERE 過濾原始行,HAVING 過濾分組後結果。HAVING 可用聚合函數,WHERE 不可。
-- 平均分 ≥ 85 的學生
SELECT stu_id, AVG(score) AS avg_score
FROM score
GROUP BY stu_id
HAVING AVG(score) >= 85;
ORDER BY 排序
ORDER BY col_name | expr | position [ASC | DESC], ...
- 位置數字:
ORDER BY 2 DESC 按 SELECT 列表第 2 列降序 - NULL 排序:ASC 置頂,DESC 置底
- 多鍵排序:先按第一鍵,相等再按第二鍵
LIMIT 分頁
LIMIT [offset,] row_count
LIMIT row_count OFFSET offset
-- 前 5 行
LIMIT 5
-- 第 2 頁,每頁 10 行
LIMIT 10 OFFSET 10 -- 或 LIMIT 10, 10
⚠️ 深分頁性能陷阱:LIMIT 1000000, 10 需掃描 100 萬行。優化方案:
1. 記住上頁最大主鍵 WHERE id > last_id LIMIT 10
2. 覆蓋索引 INDEX (id, col...)
3. 延遲關聯:子查詢取 ID 再 JOIN 回表
子句執行順序(重要)
- FROM / JOIN
- WHERE
- GROUP BY
- HAVING
- SELECT (含 DISTINCT)
- ORDER BY
- LIMIT
理解順序可避免「WHERE 用別名」「HAVING 用未分組列」等常見錯誤。