MySQL:数据查询-group by

在 MySQL 中,`GROUP BY` 子句用于将查询结果集中的数据行按照一个或多个列进行分组。通常与聚合函数(如 `COUNT()`、`SUM()`、`AVG()`、`MAX()` 和 `MIN()`)一起使用,以便对每个组的数据进行总结和分析。

一、基本语法

`GROUP BY` 的基本语法如下:
SELECT

列名1, 聚合函数(列名2)

FROM

表名

WHERE

条件
GROUP BY

列名1;

`列名1`:用于分组的列。

`聚合函数(列名2)`:对每个组的指定列进行的计算,如总和、平均值等。

示例:

扫描二维码关注公众号,回复: 17605437 查看本文章

示例 1:按部门分组

查询每个employees表中每个部门的人数。

select
    employees.department_id,
    count(*)
from
    employees
group by
    employees.department_id;

示例 2:按部门分组

查询每个部门的总薪资:

select
    employees.department_id,
    sum(employees.salary)
from
    employees
group by
    employees.department_id;

示例3:按部门分组

查询每个部门的平均薪资

select
    employees.department_id,
    avg(employees.salary)
from
    employees
group by
    employees.department_id;

示例4:按部门分组

查询每个部门的最高薪资

select
    employees.department_id,
    max(employees.salary)
from
    employees
group by
    employees.department_id;

示例5:按部门分组

查询每个部门的最低薪资

select
    employees.department_id,
    min(employees.salary)
from
    employees
group by
    employees.department_id;

二、GROUP_CONCAT函数

`GROUP_CONCAT` 函数是 MySQL 中一个非常有用的聚合函数,主要用于将同一组中的多个值连接成一个字符串。它常用于 `GROUP BY` 子句中的数据汇总,允许用户在查询结果中将多个记录的内容合并为一个。

1. 基本用法

语法:

GROUP_CONCAT(expression ORDER BY expression SEPARATOR ‘separator’)

expression: 要连接的列或表达式。
ORDER BY expression: (可选)指定连接结果的排序顺序。
SEPARATOR: (可选)定义连接多个值之间的分隔符,默认是逗号(`,`)。

示例

查询每个部门员工姓名

select
    employees.department_id,
    group_concat(employees.name)
from
    employees
group by
    employees.department_id;
2. 结合其他聚合函数使用

您也可以结合 `GROUP_CONCAT` 与其他聚合函数一起使用。例如,计算每个日期的订单数量,并列出所有销售的产品:

SELECT 
    sale_date, 
    COUNT(*) AS total_sales, GROUP_CONCAT(product_name SEPARATOR ', ') AS products_sold
FROM 
    sales
GROUP BY 
    sale_date;

三、WITH ROLLUP

`WITH ROLLUP` 是 MySQL 中用于 SQL 查询汇总功能的一个强大特性。它允许您在使用 `GROUP BY` 子句时为每个分组生成小计和总计,从而实现回溯统计的能力。`ROLLUP` 可以在统计各个层级数据时,帮助快速获取更高层次的汇总信息。

1. 基本用法

当在 `GROUP BY` 子句中使用 `WITH ROLLUP` 时,数据库会计算每个分组的总和,随后再计算小计和总计。

语法:
SELECT

column1, column2, aggregation_function(column3)

FROM

table_name

GROUP BY

column1, column2 WITH ROLLUP;

示例

查询每个部门薪资数,并计算出公司薪资总额

select
    employees.department_id,
    sum(employees.salary)
from
    employees
group by
    employees.department_id
with
    rollup;

四、WHERE 与 HAVING

通过 `WHERE` 子句可以先过滤数据,然后再进行分组,而 `HAVING` 子句则用于对分组后的结果进行筛选。

使用 `HAVING` 进行过滤:

示例:查询部门薪资数大于10万的部门,并进行降序排序。

select
    employees.department_id,
    sum(employees.salary) as s
from
    employees
group by
    employees.department_id
having
    s > 100000;

五、注意事项

聚合函数和分组列:在 `SELECT` 中未使用聚合函数的列,必须在 `GROUP BY` 中列出。这是 SQL 标准的要求。
NULL 值处理:分组时,NULL 值会被视为一个单独的组。
性能:对大型数据集使用 `GROUP BY` 可能会影响查询性能。适当的索引可以提高效率。

六、与其他 SQL 子句结合使用

`GROUP BY` 可以与 `ORDER BY`、`JOIN` 等其他 SQL 子句结合使用,以实现更复杂的查询:

与 `ORDER BY` 一起使用:

示例:查询部门薪资数大于10万的部门,并进行降序排序。

select
    employees.department_id,
    sum(employees.salary) as s
from
    employees
group by
    employees.department_id
having
    s > 100000
order by
    s desc;

七、 总结

`GROUP BY` 是 MySQL 中非常强大的语句,用于对数据进行分组并进行聚合分析。能够高效地处理和总结大量数据,在数据分析和报告中非常有用。

猜你喜欢

转载自blog.csdn.net/m0_74824483/article/details/146106265
今日推荐