面试官:分组查询(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 进粉丝群或围观朋友圈
