MySQL - having & where

本文深入探讨了MySQL中HAVING与WHERE子句的区别及其应用。HAVING用于聚合后的筛选,而WHERE则在聚合前过滤数据。通过实例,如查询所有科目及格的学生和成绩高于科目平均值的学生,详细讲解了两种子句的使用场景和语法,包括GROUP BY、INNER JOIN、LEFT JOIN等SQL操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL - having & where

having 作用于组
where作用于表或试图
所以
having 先group by 再 having +条件
where 先where+条件 再根据筛选后的结果做group by
由于新版本的mysql,group by 的依据都应出现在select的结果集中,否则会报错

例子:查询下面的表,查询出科目全部及格的同学信息。(及格:分数>=60)
表名:test_having
在这里插入图片描述

select * from
(SELECT NAME
FROM
test_having
GROUP BY
NAME
HAVING
MIN( grades ) >= 60) a
INNER JOIN test_having b ON ( a.name = b.name )
在这里插入图片描述

having后一定要加聚集函数。

面试题中还有一题是查出大于科目平均值的同学信息。
对于每一门科目需要查出平均值,然后每一个人去进行判断。
使用的源表还是上述的test_having表。
方法一:
使用left join
SELECT
*
FROM
( SELECT SUBJECT, avg( grades ) AS avg FROM test_having GROUP BY SUBJECT ) a
LEFT JOIN test_having b ON ( a.SUBJECT = b.SUBJECT AND b.grades >= a.avg )
结果如下图:
在这里插入图片描述
在写 b.grades >= a.avg 这个条件的时候,当时没有用别名,而是直接用了avg(grades),报错,提示我a中没有这个FUNCTION(FUNCTION a.avg does not exist.)。把直接使用公式换成使用别名就可以了。

方法二:
笛卡儿积 ,嵌套子查询
SELECT
a.NAME,
a.SUBJECT,
a.grades,
b.avg
FROM
test_having a,
( SELECT SUBJECT, avg( grades ) AS avg FROM test_having GROUP BY SUBJECT ) b
WHERE
a.SUBJECT = b.SUBJECT
AND a.grades >= b.avg
在这里插入图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/weixin_43248061/article/details/84101806

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值