掌握 SQL 內建函數是高效查詢與報表分析的基石。本文系統整理 COUNT、GROUP BY、HAVING、AVG、各類 JOIN 以及 UNION 的語法、差異與實戰範例。
-- 統計總行數(包含 NULL)
SELECT COUNT(*) FROM tableName;
-- 統計指定欄位非 NULL 值個數
SELECT COUNT(column_name) FROM tableName;
-- 統計指定欄位不重複值個數
SELECT COUNT(DISTINCT column_name) FROM tableName;
關鍵差異: COUNT(column) 忽略 NULL;COUNT(DISTINCT column) 去重後計數。
依一或多欄位分組,常搭配聚合函數(SUM、AVG、MAX、MIN、COUNT)使用:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
WHERE 無法搭配聚合函數,HAVING 專門過濾分組後的結果:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
資料表 tt:

資料表 tt2:

需求:統計 tt 中各 name 下 tt_value 之和,且總和 ≥ 20:
SELECT name, SUM(tt_value)
FROM tt
GROUP BY name
HAVING SUM(tt_value) >= 20;

執行順序: WHERE → GROUP BY → 聚合函數 → HAVING
SELECT AVG(column_name) FROM table_name;
查詢 tt_value 大於平均值的記錄:
SELECT * FROM tt
WHERE tt_value > (SELECT AVG(tt_value) FROM tt);
平均值為 35,結果如下:

依連接方式分為四類:
| 類型 | 說明 |
|---|---|
| INNER JOIN | 僅回傳雙方皆有匹配的行(交集) |
| LEFT JOIN | 回傳左表所有行,右表無匹配則為 NULL |
| RIGHT JOIN | 回傳右表所有行,左表無匹配則為 NULL |
| FULL JOIN | 回傳雙方所有行(並集),MySQL 需用 UNION 模擬 |
INNER JOIN(交集):

LEFT JOIN(左表全保留):

RIGHT JOIN(右表全保留):與 LEFT JOIN 相反。
FULL JOIN(並集):LEFT JOIN ∪ RIGHT JOIN。
-- 合併並去重、預設排序
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
-- 合併保留重複、不排序、效能較好
SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;
SELECT name, status FROM tt
UNION
SELECT name, status FROM tt2;

SELECT name, status FROM tt
UNION ALL
SELECT name, status FROM tt2;

效能提示: UNION 需排序去重,效能低於 UNION ALL;若確定無重複或允許重複,優先用 UNION ALL。
| 功能 | 關鍵字 | 典型場景 |
|---|---|---|
| 計數 | COUNT(*) / COUNT(col) / COUNT(DISTINCT col) | 統計總筆數、非空筆數、唯一值數 |
| 分組 | GROUP BY | 依維度彙總(如部門薪資總和) |
| 分組過濾 | HAVING | 保留銷售額 > 100萬的部門 |
| 平均 | AVG | 計算平均分、平均薪資 |
| 內連接 | INNER JOIN | 只需雙方都有資料的情況 |
| 左連接 | LEFT JOIN | 主表全保留,附表可能為空 |
| 合併去重 | UNION | 合併多張同結構表、報表彙總 |
| 合併保留重複 | UNION ALL | 日誌合併、大量資料高效匯總 |
熟練運用這些函數與子句,能讓複雜報表查詢變得簡潔高效,是 SQL 進階的必修課。