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