首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> SQL 基礎

SQL GROUP BY 子句完整教學與實戰範例

     編輯:SQL 基礎

SQL GROUP BY 子句完整教學與實戰範例


GROUP BY 子句通常搭配聚合函數使用,能依據一或多個欄位對查詢結果進行分組統計,是資料分析與報表產出的核心工具。


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 範例資料庫,包含兩張主要資料表:

Websites 網站基本資料表

+----+--------------+---------------------------+-------+---------+
| 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     |
+----+--------------+---------------------------+-------+---------+

access_log 網站訪問記錄表

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 |
+-----+---------+-------+------------+

GROUP BY 基礎應用:單表分組統計

範例:統計各站點總訪問量

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 子句可對分組後的聚合結果進行二次篩選(如 HAVING SUM(count) > 100)。
  • GROUP BY 可指定多個欄位,實現多維度交叉分析(如 GROUP BY country, site_id)。
  • 大量資料分組時,建議在分組欄位上建立索引以提升效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved