Mysql中Group By使用Having语句配合查询

注意 :

having语句是必须和GROUP BY一起使用的,语句中可以只有GROUP,但是不可以只有Having,当然可以而这可以同时出现的。

Having短语与WHERE的区别!!!
WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。

下面我们举例说明

首先我们创建这么一张表:
这里写图片描述

简单的介绍一下每一个域的意思:JOB—工种、SAL—–工资、DEP—–部门

插入数据:
这里写图片描述

需求:从该表中筛选出工种不是“M” ,以部门来划分平均工资大于28000,按降序排列的记录。

代码:

SELECT  DEP,    JOB,    AVG(SAL)
FROM    EMPL
WHERE   JOB <> 'M'
GROUP BY    DEP,    JOB
HAVING  AVG(SAL) > 28000
ORDER BY    3 DESC;

我们来一步一步地剖析这个长SQL语句:

第一,from得到的是所有的表中的记录,也就是:
这里写图片描述

第二,where 得到

这里写图片描述

第三步,group by DEP,JOB得到
这里写图片描述

第四步,having avg(SAL)>28000
也就是从所得的五个分组中找出平均工资大于28000的分组,也就是第二、四、五组

这里写图片描述

第五步就是降序排列:(当然SELECT我们一直在使用,其实这以整句的查询是有六个子句的)所以最终结果就是

这里写图片描述

这里有一个值得注意的地方就是,当我们把查询结果的第三个域改为SAL的时候,查询结果会怎么样呢?

SELECT
    DEP,
    JOB,
    SAL
FROM
    EMPL
WHERE
    JOB <> 'M'
GROUP BY
    DEP,
    JOB
HAVING
    AVG(SAL) > 28000
ORDER BY
    3 DESC;

那么结果就是每一个组中的第一条记录的SAL,这是没有任何实际意义的,因为这既不是最多的工资,也不是最小的工资,他只是每一个组中的第一条记录对应的SAL
这里写图片描述

正如我上面所说的一样,31000是BLU这组的第一条记录的SAL,33000是GRE这一组的第一条记录的SAL,32000是RED这一组的第一条记录

看一下查询结果:
这里写图片描述

所以我们在投影的时候一定要特别注意每一个域的实际意义!

一定要记住这一条规则

SELECT子句中包含集函数

SELECT子句中包含的列:
1、在集函数中的列
2、不在集函数中的列–这些列必须全部包含在GROUP BY子句中。

(即使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数 )

MySQL 中,`WHERE`、`GROUP BY` `HAVING` 是用于数据筛选分组的关键子句,它们的执行顺序逻辑流程有明确的先后关系,理解这些有助于编写高效且准确的 SQL 查询语句。 ### 执行顺序 MySQL 查询语句中,`WHERE`、`GROUP BY` `HAVING` 的执行顺序如下: 1. **`WHERE` 子句** `WHERE` 用于在查询数据时对原始表中的记录进行过滤,它会在聚合操作之前执行。这意味着只有满足 `WHERE` 条件的行才会被传递到后续的处理阶段 [^1]。 2. **`GROUP BY` 子句** 在 `WHERE` 过滤完成后,数据库会对结果集按照指定的列或表达式进行分组。`GROUP BY` 通常与聚合函数(如 `COUNT()`、`SUM()`、`AVG()` 等)一起使用,以对每个分组的数据进行汇总计算 [^2]。 3. **`HAVING` 子句** `HAVING` 用于在分组完成之后进一步筛选符合条件的分组。由于 `HAVING` 是在聚合操作之后执行,因此它可以引用聚合函数的结果 [^1]。 ### 示例说明 以下是一个包含 `WHERE`、`GROUP BY` `HAVING` 的 SQL 查询示例: ```sql SELECT SubjectId, COUNT(score) AS '参加考试人数' FROM score WHERE score > 60 GROUP BY SubjectId HAVING COUNT(score) > 4; ``` - **`WHERE score > 60`**:首先筛选出分数大于 60 的记录。 - **`GROUP BY SubjectId`**:将筛选后的记录按照 `SubjectId` 分组。 - **`HAVING COUNT(score) > 4`**:最后筛选出每组中记录数超过 4 的分组。 ### 逻辑流程总结 1. **从原始数据中筛选符合条件的记录** (`WHERE`)。 2. **将筛选后的记录按指定列分组** (`GROUP BY`)。 3. **对分组后的结果进行再次筛选** (`HAVING`)。 这种顺序确保了查询的效率准确性,因为 `WHERE` 减少了需要处理的数据量,而 `HAVING` 则专注于最终的分组结果。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值