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
全部评论

相关推荐

投递链接: https://anker-in.jobs.feishu.cn/s/iSA8v9d2校招春招3月3日全面开始,各类岗位HC充足!欢迎点击链接去看岗位。最快半个月即可发放offer!最近安克发布了员工年薪情况,2024年有494人年薪达百万,经营结果分享奖金超过8亿,欢迎大家投递,毕业三五年后年薪百万不是梦!一、笔试和面试测评:要靠拢公司价值观,可以关注安克微信公众号看看价值观历史文章,也可以去知乎搜搜华为的性格测评怎么作答,都有相似之处。行测题可以多刷一刷,整体不难。测评过不了一票否决,一定要重视并提前准备。性格测评可以参考https://www.nowcoder.com/discuss/353158733318529024,题目形式是把三个陈述按照符合程度排序,注意会有重复或接近的题目,不要前后矛盾。安克的价值观是“第一性,求极致,共成长”,第一性就是关注底层原理。cata测评言语理解、资料分析、图形推理各10道题,共30道,每道题作答时间60~90秒。难度中等,正常行测难度。笔试:容易到中等难度,多多刷题提前准备即可。面试:一定会问简历上的内容,特别是项目,另外会问重点的专业知识,还会问一些常规的问题,比如遇到困难是怎么解决的,这种都可以提前准备好,例子要具体详细有专业性。二、入职后去年校招集体培训三周,内容丰富,公司花了大力气在校招生上。研发类岗位有不少大厂来的大佬带,研发流程也在日渐规范化。平心而论,研发都不轻松的,毕竟薪酬还是到位的。安克的商业类岗位挺吃香的,海外业务做得风生水起。公司内氛围比较自由,大家都互喊英文名,发色服饰纹身自由。公司有电影、羽毛球、篮球、健身、游泳等活动,参加各种小活动可以领充电宝、耳机等礼品,另外每年发两次tws耳机、音箱等产品。除了五险一金还有商业保险、加班打车等福利。另外,公司有猫可以撸!三、内推链接欢迎大家去看看岗位啊,内推简历会优先筛选的,也可以私信我跟踪进度。投递链接: https://anker-in.jobs.feishu.cn/s/iSA8v9d2
安克创新 Anker
|
校招
|
超多精选岗位
点赞 评论 收藏
分享
03-11 12:10
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务