聚合函數是資料分析的基石,將多行資料彙總為單一統計值。掌握其行為細節(NULL 處理、DISTINCT 去重、分組搭配)是撰寫高效查詢的關鍵。
| 函數 | 語法 | 適用資料型別 | NULL 處理 | 支援 DISTINCT |
|---|---|---|---|---|
| COUNT | COUNT([ALL|DISTINCT] expression) COUNT(*) |
所有型別 | 忽略 NULL COUNT(*) 計算所有列 |
是 |
| SUM | SUM([ALL|DISTINCT] expression) | 數值型別 | 忽略 NULL | 是 |
| AVG | AVG([ALL|DISTINCT] expression) | 數值型別 | 忽略 NULL | 是 |
| MIN | MIN(expression) | 數值、字串、日期時間 | 忽略 NULL | 否 |
| MAX | MAX(expression) | 數值、字串、日期時間 | 忽略 NULL | 否 |
-- 統計所有列(包含全 NULL 列) SELECT COUNT(*) FROM orders -- 統計特定欄位非 NULL 值個數 SELECT COUNT(customer_id) FROM orders -- 去重統計 SELECT COUNT(DISTINCT customer_id) FROM orders
效能提示: COUNT(*) 通常比 COUNT(欄位) 快,因為不需檢查 NULL。
-- 銷售額去重求和(通常不合理,除非業務需求特殊) SELECT SUM(DISTINCT amount) FROM sales -- 正確做法:先去重再聚合 SELECT SUM(amount) FROM (SELECT DISTINCT amount FROM sales) t
-- 字串按字典序 SELECT MIN(name), MAX(name) FROM customers -- 日期取最早/最晚 SELECT MIN(order_date), MAX(order_date) FROM orders
SELECT
COUNT(*) AS total_orders,
COUNT(CASE WHEN status = 'completed' THEN 1 END) AS completed,
COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled,
SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS revenue
FROM orders
SELECT
YEAR(order_date) AS yr,
MONTH(order_date) AS mo,
COUNT(*) AS order_count,
SUM(amount) AS total_amount,
AVG(amount) AS avg_amount
FROM orders
GROUP BY YEAR(order_date), MONTH(order_date)
ORDER BY yr, mo
SELECT
order_id,
customer_id,
amount,
SUM(amount) OVER (PARTITION BY customer_id) AS customer_total,
AVG(amount) OVER () AS global_avg
FROM orders
SELECT name, COUNT(*) FROM users — 非聚合欄位未出現在 GROUP BYWHERE COUNT(*) > 10 — 聚合條件必須用 HAVINGHAVING COUNT(*) > 10 — 正確寫法