<span>DQL -- 分组查询</span>

分组查询

概述

  • 语法

    SELECT column, group_function(column)
    FROM table
    [WHERE condition]
    GROUP BY group_by_expression
    [ORDER BY column];
    
  • 注意

    查询列表必须特殊,要求时分组函数和group by后出现的字段

  • 特点

    1. 分组筛选中的筛选条件分为两类:

      分组状态 数据源 位置 关键字
      分组前筛选 原始表 group by子句的前面 where
      分组后筛选 分组厚的结果集 group by子句的后面 having
      • 分组函数最条件肯定是放在having子句中
      • 能用分组前少选的,就优先考虑使用分组前筛选
    2. group by语句支持单个字段分组,也可以支持多个 字段分组(多个字段之间用逗号隔开),表达式或函数(用的较少)

    3. 排序也可以被添加,是放在最后的

引入:查询每个部门的平均工资

SELECT DISTINCT
    department_id, AVG(salary)
FROM
    employees;
  • 案例1:查询每个工种的最高工资,并且降序排序

    SELECT 
        job_id, MAX(salary) MAX_SAL
    FROM
        employees
    GROUP BY job_id
    ORDER BY MAX_SAL DESC;
    
  • 案例2:查询每个位置上的部门的个数

    SELECT 
        COUNT(*), location_id
    FROM
        departments
    GROUP BY location_id;
    

添加筛选条件

  • 案例1:查询邮箱中包含a字符的,每个部门的平均工资

    SELECT 
        AVG(salary), department_id
    FROM
        employees
    WHERE
        email LIKE '%a%'
    GROUP BY department_id;
    
  • 案例2:查询有奖金的每个领导手下员工的最高工资

    SELECT 
        MAX(salary), manager_id
    FROM
        employees
    WHERE
        commission_pct IS NOT NULL
    GROUP BY manager_id;
    

添加复杂的筛选条件

  • 案例1:查询那个部门员工的个数大于2

    # 1. 查询每个部门的员工数
    SELECT 
        department_id, COUNT(*) DEP_COUNT
    FROM
        employees
    GROUP BY department_id;
    # 2. 根据1的结果进行筛选(使用关键字 HAVING)
    SELECT 
        department_id, COUNT(*) DEP_COUNT
    FROM
        employees
    GROUP BY department_id
    HAVING DEP_COUNT > 2;
    
  • 案例2:查询每个工种有奖金的员工的最高工资大于12000的工种编号和最高工资

    SELECT 
        job_id, MAX(salary) MAX_SAL
    FROM
        employees
    GROUP BY job_id
    HAVING MAX_SAL > 12000;
    
  • 案例3:查询领导编号大于120的每个领导手下的最低工资大于5000的林道编号是那个,及其最低工资

    SELECT 
        manager_id, MIN(salary) MIN_SAL
    FROM
        employees
    WHERE
        manager_id > 120
    GROUP BY manager_id
    HAVING MIN_SAL > 5000;
    

按表达式或函数分组

  • 案例:按员工行民的长度分组,查询每一组的员工个数,筛选员工个数大于5的有那些

    SELECT 
        LENGTH(last_name) NAME_LEN, COUNT(*)
    FROM
        employees
    GROUP BY NAME_LEN
    HAVING COUNT(*) > 5;
    

按多个字段分组

  • 案例:查询每个部门每个工种的员工的平均工资
SELECT 
    department_id, job_id, ROUND(AVG(salary), 2)
FROM
    employees
GROUP BY department_id , job_id;

相关测试

  1. 查询job_id的员工工资的最大值,最小值,平均值,总和,并按照job_id升序

    SELECT 
        job_id,
        MAX(salary),
        MIN(salary),
        ROUND(AVG(salary), 2),
        SUM(salary)
    FROM
        employees
    GROUP BY job_id
    ORDER BY job_id ASC;
    
  2. 查询员工最高工资和最低工资的差距(DIFFERENCE)

    SELECT 
        MAX(salary) - MIN(salary) DIFFERENCE
    FROM
        employees;
    
  3. 查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内

    SELECT 
        manager_id, MIN(salary) MIN_SAL
    FROM
        employees
    WHERE
        manager_id IS NOT NULL
    GROUP BY manager_id
    HAVING MIN_SAL >= 6000;
    
  4. 查询所有部门的编号,员工数量和工资平均值,并按照平均工资降序

    SELECT 
        department_id, COUNT(*) STUFF_Q, AVG(salary) AVG_SAL
    FROM
        employees
    GROUP BY department_id
    ORDER BY AVG_SAL DESC;
    
全部评论

相关推荐

10-19 10:28
已编辑
西南石油大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
HeaoDng:美团好像可以触发一面通
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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