GROUP BY 子句通常搭配聚合函數使用,能依據一或多個欄位對查詢結果進行分組統計,是資料分析與報表產出的核心工具。
GROUP BY 子句的基本語法結構如下:
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;
執行流程為:先依 WHERE 條件篩選資料,再依 GROUP BY 指定的欄位分組,最後對每個群組套用聚合函數(如 SUM、COUNT、AVG 等)計算統計值。SELECT 清單中未包含在聚合函數內的欄位,必須出現在 GROUP BY 子句中。
本教學使用 RUNOOB 範例資料庫,包含兩張主要資料表:
+----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘寶 | https://www.taobao.com/ | 13 | CN | | 3 | 菜鳥教程 | https://www.runoob.com/ | 4689 | CN | | 4 | 微博 | https://weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 3 | USA | | 7 | stackoverflow| https://stackoverflow.com/ | 0 | IND | +----+--------------+---------------------------+-------+---------+
mysql> SELECT * FROM access_log; +-----+---------+-------+------------+ | aid | site_id | count | date | +-----+---------+-------+------------+ | 1 | 1 | 45 | 2016-05-10 | | 2 | 3 | 100 | 2016-05-13 | | 3 | 1 | 230 | 2016-05-14 | | 4 | 2 | 10 | 2016-05-14 | | 5 | 5 | 205 | 2016-05-14 | | 6 | 4 | 13 | 2016-05-15 | | 7 | 3 | 220 | 2016-05-15 | | 8 | 5 | 545 | 2016-05-16 | | 9 | 3 | 201 | 2016-05-17 | +-----+---------+-------+------------+
SELECT site_id, SUM(access_log.count) AS nums FROM access_log GROUP BY site_id;
執行結果將顯示每個 site_id 及其對應的訪問次數總和:
若需顯示網站名稱而非 ID,可結合 LEFT JOIN 將兩表關聯後再分組:
SELECT Websites.name, COUNT(access_log.aid) AS nums FROM access_log LEFT JOIN Websites ON access_log.site_id = Websites.id GROUP BY Websites.name;
此查詢將輸出網站名稱與該站在 access_log 中出現的記錄數:
HAVING SUM(count) > 100)。GROUP BY country, site_id)。