SQL分组查询
在SQL中,分组查询是一种强大的工具,允许我们根据某些列对数据进行分组,并对每个组应用聚合函数(如COUNT
、SUM
、AVG
等)。通过分组查询,我们可以从大量数据中提取有意义的汇总信息。
什么是分组查询?
分组查询的核心是GROUP BY
子句。它允许我们将数据按照一个或多个列进行分组,然后对每个组应用聚合函数。例如,我们可以计算每个部门的员工数量,或者统计每个产品的销售总额。
基本语法
sql
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1;
column1
:用于分组的列。aggregate_function(column2)
:对每个组应用的聚合函数,如COUNT
、SUM
、AVG
等。
示例:统计每个部门的员工数量
假设我们有一个employees
表,其中包含以下数据:
id | name | department | salary |
---|---|---|---|
1 | Alice | HR | 50000 |
2 | Bob | IT | 60000 |
3 | Charlie | HR | 55000 |
4 | David | IT | 65000 |
5 | Eve | Finance | 70000 |
我们想要统计每个部门的员工数量。可以使用以下SQL查询:
sql
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department;
输出结果
department | employee_count |
---|---|
HR | 2 |
IT | 2 |
Finance | 1 |
使用HAVING子句过滤分组结果
有时我们可能只想查看满足某些条件的分组。例如,我们只想查看员工数量大于1的部门。这时可以使用HAVING
子句。
sql
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 1;
输出结果
department | employee_count |
---|---|
HR | 2 |
IT | 2 |
备注
HAVING
子句与WHERE
子句的区别在于,WHERE
在分组前过滤行,而HAVING
在分组后过滤组。
实际应用场景
案例1:统计每个产品的销售总额
假设我们有一个sales
表,其中包含以下数据:
id | product | amount |
---|---|---|
1 | A | 100 |
2 | B | 200 |
3 | A | 150 |
4 | C | 300 |
5 | B | 250 |
我们想要统计每个产品的销售总额。可以使用以下SQL查询:
sql
SELECT product, SUM(amount) AS total_sales
FROM sales
GROUP BY product;
输出结果
product | total_sales |
---|---|
A | 250 |
B | 450 |
C | 300 |
案例2:计算每个部门的平均工资
回到employees
表,我们可以计算每个部门的平均工资:
sql
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;
输出结果
department | average_salary |
---|---|
HR | 52500 |
IT | 62500 |
Finance | 70000 |
总结
SQL的分组查询功能非常强大,能够帮助我们轻松地从大量数据中提取汇总信息。通过GROUP BY
子句和聚合函数,我们可以对数据进行分组统计,并通过HAVING
子句进一步过滤结果。
附加资源
练习
- 在
employees
表中,统计每个部门的最高工资。 - 在
sales
表中,统计每个产品的销售次数。
通过完成这些练习,你将更深入地理解SQL分组查询的应用。