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

MySQL 分組查詢與連接查詢深度解析:GROUP BY 進階、內外連接、聚合實戰

     編輯:MySQL 綜合教學

MySQL 分組查詢與連接查詢深度解析:GROUP BY 進階、內外連接、聚合實戰

GROUP BY 與 JOIN 是多維分析的雙引擎。本文系統講解分組查詢六大模式(單獨、GROUP_CONCAT、聚合函數、HAVING、多字段、WITH ROLLUP)、內外連接三類語法與語義差異,並給出演練場景。

一、GROUP BY 六大模式

模式語法結果特徵適用場景
單獨使用GROUP BY sex每組僅顯示第一行(非聚合列不確定)快速檢查分組鍵分布
+ GROUP_CONCATGROUP BY sex, GROUP_CONCAT(name)每組非聚合列拼接展示審計、導出明細清單
+ 聚合函數GROUP BY sex, COUNT(*)每組統計指標報表、儀表盤
+ HAVINGGROUP BY sex HAVING COUNT(*) >= 3分組後過濾篩選大客戶、活躍用戶
多字段分組GROUP BY dept_id, sex層級聚合(先部門再性別)多維度交叉分析
+ WITH ROLLUPGROUP BY sex WITH ROLLUP末行顯示總計(分組鍵為 NULL)報表總計行自動生成

二、連接查詢:語義與語法對照


-- 1. 內連接:僅返回雙方匹配行
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;
-- 等價舊寫法(不推薦)
SELECT e.id, e.name, e.dept_id, d.dept_name
FROM employee e, department d
WHERE e.dept_id = d.dept_id;

-- 2. 左連接:保留左表所有行,右表無匹配填 NULL
SELECT e.id, e.name, e.dept_id, d.dept_name
FROM employee e
LEFT JOIN department d ON e.dept_id = d.dept_id;

-- 3. 右連接:保留右表所有行(可由左連接交換表順序替代)
SELECT e.id, e.name, e.dept_id, d.dept_name
FROM employee e
RIGHT JOIN department d ON e.dept_id = d.dept_id;
-- 等價
SELECT e.id, e.name, e.dept_id, d.dept_name
FROM department d
LEFT JOIN employee e ON e.dept_id = d.dept_id;

三、連接類型選型決策

業務問題連接類型關鍵點
查詢有部門的員工INNER JOIN雙方必須存在
查詢所有員工及其部門(含無部門)LEFT JOIN左表全保留
查詢所有部門及其員工(含空部門)RIGHT JOIN / LEFT JOIN 交換順序右表全保留
查詢無部門員工 + 空部門FULL OUTER JOIN (MySQL 不支持)LEFT JOIN UNION RIGHT JOIN 模擬

四、聚合函數在連接查詢中的應用


-- 每個部門員工數(含 0 人部門)
SELECT d.dept_name, COUNT(e.id) AS emp_cnt
FROM department d
LEFT JOIN employee e ON d.dept_id = e.dept_id
GROUP BY d.dept_id, d.dept_name;

-- 每門課程最高分
SELECT c.course_name, MAX(g.score) AS max_score
FROM course c
LEFT JOIN grade g ON c.course_id = g.course_id
GROUP BY c.course_id, c.course_name;

五、性能優化提示

  • GROUP BY 默認排序(隱式 ORDER BY),大數據集加 ORDER BY NULL 禁用排序
  • 連接條件列必須建索引,且類型長度一致(避免隱式轉換)
  • 小表驅動大表:LEFT JOIN 時左表應為小表;INNER JOIN 優化器自動選擇驅動表
  • GROUP_CONCAT 受 group_concat_max_len (默認 1024) 限制,大文本需調大
  • WITH ROLLUP 不支持 ORDER BY,需外層包裹排序

六、練習題

  1. 統計每個部門男/女員工數,顯示部門名、性別、人數,按部門名、性別排序
  2. 查詢所有課程及其選課學生數(含 0 人課程),按人數降序
  3. 找出薪資高於本部門平均薪資的員工(子查詢 + 連接)
  4. 模擬 FULL OUTER JOIN:查詢所有員工與部門,含無部門員工與空部門

分組聚合與多表連接是 SQL 表達業務邏輯的核心組合。建議以「業務問題 → 關係代數 → SQL 寫法 → 執行計劃驗證」四步法練習,逐步建立從需求到高性能 SQL 的直覺映射。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved