MySQL分组查询与连接查询实战指南

纸上星河
纸上星河
发布时间:2026-10-13 | 4人浏览过
原创

在MySQL数据库中,高效的数据检索离不开分组与连接操作。本文详细讲解了如何使用 GROUP BY 实现数据的分类统计,包括聚合函数的应用、条件过滤及汇总行;同时对比了内连接与左、右外连接的执行逻辑,帮助读者构建准确的复杂查询语句。

分组查询:使用GROUP BY进行分类统计

GROUP BY 子句用于根据指定的属性值将结果集划分为多个组。其标准语法结构为:GROUP BY 属性名 [HAVING 条件表达式] [WITH ROLLUP]。其中,HAVING 用于限制显示的分组(仅显示满足条件的组),WITH ROLLUP 则在所有记录的最后添加一条记录,该行通常是前面所有记录的总和。

第1步:理解基础分组行为

若单独使用 GROUP BY 且不搭配聚合函数,MySQL通常只返回每个分组中的一条随机记录。例如:

SELECT * FROM employee GROUP BY sex;

上述语句会按照“性别”字段进行分组,由于每组(男、女)可能有多人,执行结果仅显示两条记录(即每组的某一条)。这通常不是我们预期的统计结果,因此需配合聚合函数使用。

第2步:结合聚合函数进行统计分析

在处理分组数据时,最常结合的是集合函数(如 COUNT, SUM, AVG, MAX, MIN)以及 GROUP_CONCAT。

1. 使用 GROUP_CONCAT 展示组内详情:

如需查看每个分组包含的具体成员,可使用 GROUP_CONCAT 函数:

SELECT sex, GROUP_CONCAT(name) FROM employee GROUP BY sex;

输出示例:

sex | group_concat(name)
------|------------------
女   | 小红,小兰
男   | 张三,王五,王六

2. 使用 COUNT 进行计数:

SELECT sex, COUNT(sex) FROM employee GROUP BY sex;

3. 计算其他指标:

  • 求和:SUM() 仅适用于数值类型字段。
  • 平均值:AVG() 计算字段平均值。
  • 最大/最小值:MAX() / MIN();对于字符串类型,比较是基于ASCII码进行的。

第3步:利用 HAVING 过滤分组结果

当我们需要对分组后的数据进行二次筛选时(即过滤掉不满足特定统计条件的组),必须使用 HAVING 而非 WHERE。WHERE 作用于单行记录,而 HAVING 作用于聚合后的组。

实例:查询人数大于等于3人的性别组:

SELECT sex, COUNT(sex) 
FROM employee 
GROUP BY sex 
HAVING COUNT(sex) >= 3;

第4步:多字段分组与汇总 (WITH ROLLUP)

多字段分组: GROUP BY 可以指定多个字段,数据将先按第一字段分组,再在第一字段相同的子集中按第二字段分组。

SELECT * FROM employee GROUP BY d_id, sex;

添加汇总行: 使用 WITH ROLLUP 可在结果末尾追加一行汇总数据(通常为 NULL 键或总标记):

SELECT sex, COUNT(sex) 
FROM employee 
GROUP BY sex WITH ROLLUP;

执行结果会在男女两组之后,增加一行“总计”行:

sex | count(sex)
----|----------
女  | 1
男  | 5
NULL| 6

连接查询:多表数据关联提取

连接查询(Join)通过两个或多个表中具有关联意义的字段,将数据组合在一起查询。常见的连接有内连接和外连接。

第1步:执行内连接 (INNER JOIN / Implicit Join)

内连接只返回两个表中连接字段相等的行。如果一方没有匹配的记录,该行不会出现在结果中。

实例 1:显式 INNER JOIN 语法(推荐):

SELECT num, name, employee.d_id, age, d_name 
FROM employee 
INNER JOIN department ON employee.d_id = department.d_id;

实例 2:隐式连接(逗号分隔):

SELECT num, name, employee.d_id, age, d_name 
FROM employee, department 
WHERE employee.d_id = department.d_id;

注意: 当两表含有同名字段(如 d_id)时,必须在列名前明确指定所属表名(如 employee.d_id),否则会导致歧义报错。

第2步:执行外连接 (OUTER JOIN)

外连接不仅返回匹配的记录,还保留其中一个表的所有记录,未匹配的字段以 NULL 填充。

1. 左连接 (LEFT JOIN):

保留左表(第一个表)的所有记录。即使右表没有匹配项,左表记录也会显示,右表字段填 NULL。

SELECT num, name, employee.d_id, age, d_name 
FROM employee 
LEFT JOIN department ON employee.d_id = department.d_id;

2. 右连接 (RIGHT JOIN):

保留右表(第二个表)的所有记录。与左连接相反,确保右边数据不丢失。

常见集合函数速查

函数 功能说明 备注
COUNT(*) 统计行数 常配合 GROUP BY 使用
SUM(列名) 求和 仅支持数值型字段
AVG(列名) 平均值 仅支持数值型字段
MAX/MIN(列名) 最大值/最小值 可处理字符串(按字典序或ASCII)

以上就是MySQL分组查询与连接查询的详细内容,更多关于MySQL高级查询技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表