SQL 分组查询
分组查询
在 SQL 中,分组查询是数据处理和分析中非常重要的部分。通过 GROUP BY
子句,可以将数据按指定列分组,并对每个分组进行聚合计算、排序、过滤等操作。这在统计分析、报表生成和数据汇总中非常有用。以下是对分组查询的详细讲解。
1. GROUP BY
子句的基本语法
GROUP BY
子句用于将数据按指定列分组。语法如下:
SELECT column1, column2, aggregate_function(column3)
FROM table_name
GROUP BY column1, column2;
- 其中:
column1, column2
:指定分组的列。aggregate_function(column3)
:对每个分组进行聚合计算的函数,如SUM
、AVG
、COUNT
、MAX
、MIN
等。GROUP BY
子句可以包含任意数目的列,因而可以对分组进行嵌套, 更细致地进行数据分组。- 除聚集计算语句外,
SELECT
语句中的每一列都必须在GROUP BY
子句 中同时给出。 - 如果分组列中包含具有
NULL
值的行,则NULL
将作为一个分组返回。 如果列中有多行NULL
值,它们将分为一组。 GROUP BY
子句必须出现在WHERE
子句之后,ORDER BY
子句之前。
HAVING
子句用于对分组后的结果进行过滤。语法如下:
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;
ORDER BY
子句用于对分组后的结果进行排序。语法如下:
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
ORDER BY column2[ASC|DESC];
2. 示例
假设有一个 employees
表,包含以下数据:
1 | Alice | Smith | 60000 | 101 |
2 | Bob | Johnson | 70000 | 101 |
3 | Charlie | Brown | 50000 | 102 |
4 | David | Davis | 80000 | 102 |
5 | Eve | White | 90000 | 103 |
1:按单列分组
按部门分组,计算每个部门的平均工资:
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id;
结果:
101 | 65000 |
102 | 65000 |
103 | 90000 |
2:按多列分组
按部门和工资范围分组,计算每个部门中不同工资范围的员工数量:
SELECT
department_id,
CASE
WHEN salary BETWEEN 50000 AND 60000 THEN '50000-60000'
WHEN salary BETWEEN 60001 AND 70000 THEN '60001-70000'
WHEN salary BETWEEN 70001 AND 80000 THEN '70001-80000'
WHEN salary BETWEEN 80001 AND 90000 THEN '80001-90000'
ELSE '90000+'
END AS salary_range,
COUNT(*) AS employee_count
FROM employees
GROUP BY department_id, salary_range;
结果:
101 | 60001-70000 | 2 |
102 | 50000-60000 | 1 |
102 | 70001-80000 | 1 |
103 | 90000+ | 1 |
3:结合 HAVING
子句
按部门分组,计算每个部门的总工资,并过滤出总工资大于 120000 的部门:
SELECT department_id, SUM(salary) AS total_salary
FROM employees
GROUP BY department_id
HAVING SUM(salary) > 120000;
结果:
102 | 130000 |
103 | 90000 |
4:结合 ORDER BY
子句
按部门分组,计算每个部门的平均工资,并按平均工资降序排序:
SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id
ORDER BY average_salary DESC;
结果:
103 | 90000 |
102 | 65000 |
101 | 65000 |