MYSQL中分组查询、聚合查询及联合查询的使用方法及区别详解

原创 2025-05-27 10:20:47编程技术
553

在MySQL数据库操作中,分组查询(GROUP BY)聚合查询(Aggregate Functions)联合查询(UNION)是数据检索与分析的核心工具。三者既可独立使用,也可组合应用,但功能定位和使用场景存在本质差异。本文ZHANID工具网将通过语法解析、案例演示和对比分析,系统讲解这三种查询方式的技术细节与实践技巧。

一、分组查询(GROUP BY):数据分类统计的利器

1. 基础语法与核心逻辑

SELECT column1, aggregate_function(column2)
FROM table
GROUP BY column1
HAVING condition;
  • GROUP BY:按指定列对数据进行分组,相同值的行归为一组。

  • HAVING:对分组后的结果进行过滤(与WHERE的区别在于WHERE过滤行,HAVING过滤组)。

2. 典型应用场景

场景1:统计各部门人数

SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;

输出结果:

+------------+---------------+
| department | employee_count|
+------------+---------------+
| IT         | 15            |
| HR         | 8             |
| Sales      | 22            |
+------------+---------------+

场景2:多列分组统计

SELECT department, YEAR(hire_date), AVG(salary)
FROM employees
GROUP BY department, YEAR(hire_date);

3. 高级技巧

技巧1:WITH ROLLUP 生成汇总行

SELECT department, SUM(salary)
FROM employees
GROUP BY department WITH ROLLUP;

输出结果:

+------------+-------------+
| department | SUM(salary) |
+------------+-------------+
| IT         | 1500000     |
| HR         | 800000      |
| NULL       | 2300000     | -- 总汇总行
+------------+-------------+

技巧2:GROUP_CONCAT 拼接分组值

SELECT department, GROUP_CONCAT(name SEPARATOR '; ')
FROM employees
GROUP BY department;

二、聚合查询(Aggregate Functions):数值计算的瑞士军刀

1. 常用聚合函数详解

函数 功能说明 示例
COUNT() 统计行数COUNT(*)
SUM() 计算数值列总和SUM(salary)
AVG() 计算数值列平均值AVG(score)
MAX()/MIN() 获取最大/最小值MAX(order_date)
STDDEV() 计算标准差STDDEV(temperature)

2. 聚合查询的两种模式

模式1:全表聚合

SELECT COUNT(*) AS total, AVG(salary) AS avg_salary
FROM employees;

模式2:分组聚合(需配合GROUP BY)

SELECT department, SUM(salary) AS dept_salary
FROM employees
GROUP BY department;

3. 性能优化建议

  • 索引优化:对WHERE条件中的列和GROUP BY列建立索引。

  • **避免SELECT ***:聚合查询只返回必要列,减少数据传输量。

  • 使用覆盖索引:当查询字段全部包含在索引中时,可避免回表操作。

三、联合查询(UNION):结果集的垂直合并

1. 基础语法规则

SELECT column1 FROM table1
UNION [ALL]
SELECT column2 FROM table2;
  • UNION:自动去重合并结果集。

  • UNION ALL:保留所有重复记录。

  • 要求:两个SELECT语句的列数、数据类型必须兼容。

2. 典型应用场景

场景1:合并同类数据

-- 合并两个季度的销售数据
SELECT product, q1_sales FROM quarter1
UNION ALL
SELECT product, q2_sales FROM quarter2;

场景2:替代OR条件

-- 查询北京或上海的员工
SELECT * FROM employees WHERE city = '北京'
UNION
SELECT * FROM employees WHERE city = '上海';

3. 高级用法

用法1:UNION与ORDER BY配合

(SELECT name FROM students ORDER BY score DESC LIMIT 5)
UNION
(SELECT name FROM teachers ORDER BY hire_date LIMIT 5)
ORDER BY name; -- 全局排序

用法2:UNION ALL优化性能

-- 当明确需要保留重复数据时
SELECT user_id FROM login_logs_2024
UNION ALL
SELECT user_id FROM login_logs_2025;

mysql.webp

四、三者的核心区别与协作模式

1. 功能定位对比

特性 GROUP BY Aggregate Functions UNION
主要目的 数据分组 数值计算 结果集合并
操作维度 行分组 列计算 结果集垂直拼接
是否独立使用
典型组合 GROUP BY + HAVING 聚合函数 + WHERE UNION + ORDER BY

2. 协作使用案例

案例:统计各部门薪资信息

SELECT 
    department,
    COUNT(*) AS total_employees,
    AVG(salary) AS avg_salary,
    MAX(salary) AS max_salary
FROM employees
WHERE salary > 5000  -- 先过滤
GROUP BY department   -- 再分组
HAVING COUNT(*) > 10 -- 后过滤分组
ORDER BY avg_salary DESC;

案例:合并历史数据

-- 合并当前订单与历史归档订单
(SELECT order_id, amount, 'current' AS type FROM orders WHERE order_date >= '2025-01-01')
UNION ALL
(SELECT order_id, amount, 'archive' AS type FROM order_archive WHERE order_date < '2025-01-01')
ORDER BY order_id;

五、常见错误与解决方案

1. GROUP BY常见错误

  • 错误1SELECT list is not in GROUP BY

    -- 错误示例:非聚合列未包含在GROUP BY中
    SELECT department, name, AVG(salary) FROM employees GROUP BY department;
    
    -- 正确写法:
    SELECT department, AVG(salary) FROM employees GROUP BY department;
  • 错误2:混淆WHERE与HAVING

    -- 错误示例:使用WHERE过滤分组
    SELECT department, AVG(salary)
    FROM employees
    WHERE AVG(salary) > 8000  -- 错误!WHERE不能使用聚合函数
    GROUP BY department;
    
    -- 正确写法:
    SELECT department, AVG(salary)
    FROM employees
    GROUP BY department
    HAVING AVG(salary) > 8000;

2. UNION常见错误

  • 错误1:列数不匹配

    -- 错误示例:两个SELECT列数不同
    SELECT id, name FROM users
    UNION
    SELECT email FROM contacts;
  • 错误2:数据类型不兼容

    -- 错误示例:字符串与数值类型混合
    SELECT product_id FROM products
    UNION
    SELECT stock_quantity FROM inventory;

六、性能调优实战建议

1. 分组查询优化

  • 索引策略

    ALTER TABLE employees ADD INDEX idx_dept_salary (department, salary);
  • 减少临时表:避免在GROUP BY列上进行函数操作。

2. 聚合查询优化

  • 覆盖索引

    -- 创建包含查询列的索引
    CREATE INDEX idx_salary ON employees(salary, department);
  • 避免全表扫描:对大数据量表,优先使用WHERE条件过滤。

3. 联合查询优化

  • 分页优化

    -- 对UNION结果集分页
    SELECT * FROM (
      (SELECT ... FROM table1)
      UNION ALL
      (SELECT ... FROM table2)
    ) AS combined
    LIMIT 20 OFFSET 0;
  • 并行执行:在MySQL 8.0+中,可启用并行查询提升UNION性能。

七、总结与选型指南

场景描述 推荐方案 关键语法要素
统计各分类指标 GROUP BY + 聚合函数 GROUP BY, HAVING
全局数值计算 聚合函数 COUNT(), SUM()等
合并同类结构数据 UNION/UNION ALL 列匹配、去重控制
复杂分组过滤+全局排序 GROUP BY + HAVING + ORDER BY 多子句协作
历史数据与实时数据联合分析 UNION ALL + 类型标记 子查询标记+全局排序

通过合理组合这三种查询方式,可解决90%以上的数据分析需求。实际开发中,建议遵循"先过滤(WHERE)、再分组(GROUP BY)、后聚合(聚合函数)、最后联合(UNION)"的处理顺序,并充分利用索引优化提升查询性能。

MYSQL 分组查询 聚合查询 联合查询
THE END
战地网
频繁记录吧,生活的本意是开心

相关推荐

如何在 MySQL 中实现定时任务?Event Scheduler 全攻略
MySQL 自5.1.6版本起内置的 Event Scheduler(事件调度器) 功能,允许直接在数据库层面实现定时任务调度,无需依赖外部工具如Cron或Quartz。本文ZHANID工具网将系统梳理Even...
2025-09-15 编程技术
364

Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
本文聚焦Java与MySQL协同环境下的全文检索优化实践,从索引策略、查询调优、参数配置到Java层优化,深入解析如何释放全文检索的潜力,为高并发、大数据量场景提供稳定高效的搜...
2025-09-13 编程技术
405

Java与MySQL数据库连接实战:JDBC使用教程
JDBC(Java Database Connectivity)作为Java标准API,为开发者提供了统一的数据访问接口,使得Java程序能够无缝连接各类关系型数据库。本文ZHANID工具网将以MySQL数据库为例...
2025-09-11 编程技术
409

MySQL数据类型使用场景详解:INT、VARCHAR、DATE、TEXT等核心类型实战指南
在MySQL数据库设计中,数据类型的选择直接影响存储效率、查询性能和数据完整性。本文ZHANID工具网聚焦INT、VARCHAR、DATE、TEXT等常用数据类型,通过存储特性对比、典型应用场...
2025-09-11 编程技术
415

MySQL基础语法大全:SELECT、INSERT、UPDATE、DELETE使用详解
MySQL作为最流行的开源关系型数据库管理系统,其核心操作围绕数据增删改查(CRUD)展开。本文ZHANID工具网将系统解析SELECT、INSERT、UPDATE、DELETE四大基础语句的语法规范、...
2025-09-09 编程技术
427

MySQL修改字段长度提示“Too large column size”怎么办?
当尝试修改MySQL字段长度时遇到“Too large column size”错误,通常是由于字段长度超过MySQL引擎限制或索引约束导致。本文ZHANID工具网将系统梳理错误原因、诊断方法及解决方...
2025-09-08 编程技术
420