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):对每个分组进行聚合计算的函数,如 SUMAVGCOUNTMAXMIN 等。
    • 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 表,包含以下数据:

employee_id first_name last_name salary department_id
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;

结果:

department_id average_salary
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;

结果:

department_id salary_range employee_count
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;

结果:

department_id total_salary
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;

结果:

department_id average_salary
103 90000
102 65000
101 65000
全部评论

相关推荐

烤点老白薯:他第二句话的潜台词是想让你帮他点个瑞幸或者喜茶啥的
mt对你说过最有启发的一...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务