刚开始学习数据库,想请教一下为什么having后面的那个avgsal为什么不用写成avg(sal)也可以,没有报错。
select的执行顺序不是在having后面吗,那执行having的时候avg(sal)没有as avgsal,为什么也可以直接写。
一般不能在having condition中使用select list中的alias。
但是mysql对此作了扩展。在mysql 5.7.5之前的版本,ONLY_FULL_GROUP_BY sql mode默认不开启。在5.7.5或之后的版本默认开启。
如果ONLY_FULL_GROUP_BY sql mode不开启,那么mysql对标准SQL的扩展可以生效:
1、允许在select list、having condition和order by list中使用没有出现在group by list中的字段。此时mysql会随机选择没有出现在group by list中的字段的值。效果和使用ANY_VALUE()是相同的。
2、允许在having condition中使用select list中的alias
我们都知,镜花水月般的爱情是多么不牢靠 ——《林徽因传》程碧我们都知,镜花水月般的爱情是多么不牢靠 ——《林徽因传》程碧你最好不要爱上我,因为游侠是不需要女人的,游侠非常孤独
select
deptno,avg(sal) as avgsal from emp
group by deptno
having
avgsal= (select max(t.avgsal) from (select avg(sal) as avgsal from emp group by deptno) t);
事实上你在 having 的子查询中已经将 avg(sal)
设置别名 avgsal
了,因此不会报错。如有帮助,请采纳。