面试官:分组查询(GROUP BY)会用不?
共 4636字,需浏览 10分钟
·
2024-06-14 10:51
在MySQL中,GROUP BY
是一个SQL语句中的子句,用于将查询结果集中的行根据一个或多个列的值进行分组。分组的目的是将具有相同值的行归为一组,这样就可以对每个组应用聚合函数(如SUM
, AVG
, MAX
, MIN
, COUNT
等)来进行计算,从而实现对各组数据的统计分析。
在MySQL中,分组查询(GROUP BY)是一种非常实用的功能,允许你根据一个或多个列将查询结果集划分成多个组,然后可以对每个组应用聚合函数(如SUM, AVG, MAX, MIN, COUNT等)进行计算。下面通过一个具体案例来说明分组查询的使用方法。
具体案例一:
假设我们有一个名为employees
的表,存储了公司的员工信息,包括employee_id
, name
, department_id
, salary
等字段。现在我们想统计每个部门(department_id
)的员工人数和平均薪资。
SQL查询示例
SELECT department_id, COUNT(employee_id) AS total_employees, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id;
解释
-
SELECT
- 首先,我们指定了想要从查询中获取的列。这里我们选择了department_id
(分组依据),并使用聚合函数COUNT(employee_id)
来计算每个部门的员工总数,以及AVG(salary)
来计算每个部门的平均薪资。 -
FROM employees
- 指定查询的表名为employees
。 -
GROUP BY department_id
- 这是分组查询的关键部分,它指示MySQL根据department_id
字段的值对结果集进行分组。这意味着每一组内的记录都有相同的department_id
值。 -
AS
关键字 - 用于给聚合函数的计算结果起别名,使得输出结果更易读。例如,COUNT(employee_id) AS total_employees
将计数结果显示为total_employees
。
预期结果
假设employees
表中的数据如下:
employee_id | name | department_id | salary |
---|---|---|---|
1 | Alice | 10 | 5000 |
2 | Bob | 10 | 6000 |
3 | Carol | 20 | 5500 |
4 | David | 20 | 7000 |
5 | Eve | 30 | 4500 |
执行上面的SQL查询后,预期的结果可能是:
department_id | total_employees | average_salary |
---|---|---|
10 | 2 | 5500 |
20 | 2 | 6250 |
30 | 1 | 4500 |
这个结果告诉我们,部门10有2名员工,平均薪资为5500元;部门20也是2名员工,平均薪资略高,为6250元;部门30则只有1名员工,薪资为4500元。通过这个案例,我们可以看到分组查询在数据分析和报表生成中的强大作用。
具体案例二:
当然,让我们通过一个具体的案例来进一步阐述MySQL中GROUP BY
子句的使用。设想有一个销售记录表sales_records
,包含以下字段:
-
product_id
(产品ID) -
product_name
(产品名称) -
sale_date
(销售日期) -
quantity_sold
(销售数量)
我们的目标是统计每个月每个产品的总销售数量。
SQL查询示例
SELECT
YEAR(sale_date) AS SaleYear,
MONTH(sale_date) AS SaleMonth,
product_id,
product_name,
SUM(quantity_sold) AS TotalQuantitySold
FROM
sales_records
GROUP BY
YEAR(sale_date),
MONTH(sale_date),
product_id;
解释
-
SELECT
- 我们选取了年份(通过YEAR(sale_date)
)、月份(通过MONTH(sale_date)
)、产品ID(product_id
)、产品名称(product_name
),以及每个组的销售总量(通过SUM(quantity_sold)
)。 -
FROM sales_records
- 指定查询的数据来源是sales_records
表。 -
GROUP BY
- 使用年份、月份和产品ID作为分组依据。这意味着结果将按照每年每月每个产品的销售记录被分组,每组内包含了相同年月和产品ID的所有记录。 -
SUM(quantity_sold)
- 聚合函数,用于计算每个组内quantity_sold
字段的总和,即每个月每个产品的销售总量。
预期结果
假设sales_records
表中有如下数据(简化示例):
product_id | product_name | sale_date | quantity_sold |
---|---|---|---|
1 | Product A | 2024-01-10 | 5 |
1 | Product A | 2024-01-15 | 3 |
2 | Product B | 2024-01-12 | 7 |
2 | Product B | 2024-02-01 | 2 |
1 | Product A | 2024-02-05 | 4 |
执行上述查询后,可能得到的结果如下:
SaleYear | SaleMonth | product_id | product_name | TotalQuantitySold |
---|---|---|---|---|
2024 | 1 | 1 | Product A | 8 |
2024 | 1 | 2 | Product B | 7 |
2024 | 2 | 2 | Product B | 2 |
2024 | 2 | 1 | Product A | 4 |
这个结果展示了每个产品在每个月的总销售数量,例如2024年1月,Product A总共卖出了8件,而Product B则卖出了7件。这样,通过GROUP BY
子句,我们能够轻松地对复杂数据集进行汇总和分析。
欢迎添加程序汪个人微信 itwang008 进粉丝群或围观朋友圈