跳到主要内容

SQL分组查询

在SQL中,分组查询是一种强大的工具,允许我们根据某些列对数据进行分组,并对每个组应用聚合函数(如COUNTSUMAVG等)。通过分组查询,我们可以从大量数据中提取有意义的汇总信息。

什么是分组查询?

分组查询的核心是GROUP BY子句。它允许我们将数据按照一个或多个列进行分组,然后对每个组应用聚合函数。例如,我们可以计算每个部门的员工数量,或者统计每个产品的销售总额。

基本语法

sql
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1;
  • column1:用于分组的列。
  • aggregate_function(column2):对每个组应用的聚合函数,如COUNTSUMAVG等。

示例:统计每个部门的员工数量

假设我们有一个employees表,其中包含以下数据:

idnamedepartmentsalary
1AliceHR50000
2BobIT60000
3CharlieHR55000
4DavidIT65000
5EveFinance70000

我们想要统计每个部门的员工数量。可以使用以下SQL查询:

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

输出结果

departmentemployee_count
HR2
IT2
Finance1

使用HAVING子句过滤分组结果

有时我们可能只想查看满足某些条件的分组。例如,我们只想查看员工数量大于1的部门。这时可以使用HAVING子句。

sql
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 1;

输出结果

departmentemployee_count
HR2
IT2
备注

HAVING子句与WHERE子句的区别在于,WHERE在分组前过滤行,而HAVING在分组后过滤组。

实际应用场景

案例1:统计每个产品的销售总额

假设我们有一个sales表,其中包含以下数据:

idproductamount
1A100
2B200
3A150
4C300
5B250

我们想要统计每个产品的销售总额。可以使用以下SQL查询:

sql
SELECT product, SUM(amount) AS total_sales
FROM sales
GROUP BY product;

输出结果

producttotal_sales
A250
B450
C300

案例2:计算每个部门的平均工资

回到employees表,我们可以计算每个部门的平均工资:

sql
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;

输出结果

departmentaverage_salary
HR52500
IT62500
Finance70000

总结

SQL的分组查询功能非常强大,能够帮助我们轻松地从大量数据中提取汇总信息。通过GROUP BY子句和聚合函数,我们可以对数据进行分组统计,并通过HAVING子句进一步过滤结果。

附加资源

练习

  1. employees表中,统计每个部门的最高工资。
  2. sales表中,统计每个产品的销售次数。

通过完成这些练习,你将更深入地理解SQL分组查询的应用。