語法:GROUP BY 屬性名 [HAVING 條件] [WITH ROLLUP]
SELECT * FROM employee GROUP BY sex;
-- 只會返回男、女各一條記錄(非確定性,慎用)
GROUP_CONCAT() 顯示組內明細SELECT sex, GROUP_CONCAT(name) FROM employee GROUP BY sex;
-- 結果:
-- 女 | 小紅,小蘭
-- 男 | 張三,王五,王六
SELECT sex, COUNT(*) FROM employee GROUP BY sex;
-- 結果:
-- 女 | 2
-- 男 | 3
SELECT sex, COUNT(*) FROM employee GROUP BY sex HAVING COUNT(*) >= 3;
-- 僅顯示 男 | 3
WHERE 過濾原始行,HAVING 過濾分組後結果。
SELECT * FROM employee GROUP BY dept_id, sex;
-- 先按部門分組,組內再按性別分組
SELECT sex, COUNT(*) FROM employee GROUP BY sex WITH ROLLUP;
-- 結果:
-- 女 | 2
-- 男 | 3
-- NULL | 5 <-- 總計行
字符串列會拼接,數值列求和。
SELECT e.id, e.name, e.dept_id, d.dept_name
FROM employee e
INNER JOIN department d ON e.dept_id = d.dept_id;
-- 同名欄位建議加表別名限定
| 類型 | 語法 | 結果特徵 |
|---|---|---|
| 左連接 | LEFT JOIN | 保留左表所有行,右表無匹配則 NULL |
| 右連接 | RIGHT JOIN | 保留右表所有行,左表無匹配則 NULL |
-- 左連接:查所有員工及其部門(無部門也顯示)
SELECT e.name, d.dept_name
FROM employee e
LEFT JOIN department d ON e.dept_id = d.dept_id;
| 函數 | 用途 | 範例 |
|---|---|---|
| COUNT(*) | 行數 | SELECT COUNT(*) FROM employee |
| SUM(col) | 求和 | SELECT SUM(score) FROM grade GROUP BY student_id |
| AVG(col) | 平均 | SELECT AVG(age) FROM employee |
| MAX(col) | 最大值 | SELECT MAX(score) FROM grade |
| MIN(col) | 最小值 | SELECT MIN(age) FROM employee |
SUM/AVG 只能用於數值類型;MAX/MIN 對字符串按 ASCII 比較。
SELECT id, name FROM employee WHERE dept_id = 1
UNION
SELECT id, name FROM employee WHERE dept_id = 2;
-- UNION 去重,UNION ALL 保留重複(效能更高)
-- 表別名
SELECT e.name, d.dept_name FROM employee e JOIN department d ON e.dept_id = d.dept_id;
-- 字段別名(AS 可省略)
SELECT dept_id AS department_id, dept_name AS department_name FROM department;
SELECT *,只取需要列GROUP BY 列與 SELECT 非聚合列保持一致(ONLY_FULL_GROUP_BY 模式)