IE盒子

搜索
查看: 89|回复: 1

MySQL_Group_by用法说明

[复制链接]

6

主题

13

帖子

23

积分

新手上路

Rank: 1

积分
23
发表于 2023-2-23 03:18:37 | 显示全部楼层 |阅读模式
1. sql 执行顺序

分组函数:sum,count,avg,max,min
eg:
    select  ... from  
    表
    where 条件
    group by 字段(或者字面量)
    having (过滤)分组之后条件
    order by 字段 desc(或者 asc 默认升序)
    limit 0,5;

执行顺序:

    1. from
    2. where
    3. group by
    4. having
    5. select
    6. order by
    7. limit

反例(表数据如下):
    select * from emp where sum(emp.sal) > 5000
    [Err] 1111 - Invalid use of group function

即:where 后面呢不能使用分组函数;where 先执行,再执行group by。

因为执行 where 条件时,此时还未分组,无法执行sum函数。

注:
当查询语句中没有 group by 关键字时,默认把整个表当成一组。

eg:
select sum(sal) from emp;   --  语句能正常执行。

注:
因为select执行顺序在 group by 之后,
当查询的时候,
已经分组完毕,所以能够执行sum(sal)2. 反例测试





在这里插入图片描述



在这里插入图片描述

3. 两个字段联合分组

eg:查询每个部门,不同工作岗位的最高工资
表数据:



在这里插入图片描述

-- 查询每个部门,不同工作岗位的最高工资
SELECT
e.dept,e.job_type,max(sal)
from emp e
GROUP BY e.dept,e.job_type;


注:1. group by 后面可以跟多个字段,即根据多个字段进行联合分组
    2. group by 之后,select 后面的字段可以跟的字段:
       group by 的字段
       分组函数中的字段,
       如例子中 sum() 中的 sal字段课题添加。查询结果:



在这里插入图片描述

5. 使用Having关键字对分组之后的数据进一步过滤

注:having 关键字不能放在where之前,只能搭配 group by 使用。
eg:查询每个部门最高薪资,要求只显示最高薪资大于1000的?
-- 查询每个部门最高薪资,要求只显示最高薪资大于1000的?
    select
        dept,MAX(sal) maxSal from
        emp e
    GROUP BY dept
    HAVING maxSal > 1000;


优化 sql:先将大于 1000 的查询出来,然后再分组。
-- 优化:查询每个部门最高薪资,要求只显示最高薪资大于1000的?
    select
        dept,MAX(sal) maxSal from
        emp e
    WHERE
        sal > 1000
    GROUP BY dept
    HAVING maxSal > 1000;


优化策略 —— where 和 having 优先选择 where测试:



在这里插入图片描述
回复

使用道具 举报

3

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 4 天前 | 显示全部楼层
支持支持再支持
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表