SQL的执行顺序问题
众所周知,sql的执行顺序:
sql
1 | from... where...group by... having....select ... order by... limit |
但是,有一个“bug”,在 MySQL 中:
sql
1 | SELECT title, COUNT(title) AS t FROM table GROUP BY title HAVING t >= 2 |
这样的语句是可以执行的。
正常来说,having在select之前执行,但是却可以使用select的别名,这是为什么呢?
查阅了一切资料,做出如下解释:
解释一
mysql的处理方式是中间生成虚拟表(或者叫临时表),而这个虚拟表的生成的列靠的就是select。
所以猜测类似having之后的操作,其实内部已经根据select生成了虚拟表,列自然也是as后的。
解释二
之所以MYSQL可以这么做是因为MYSQL用的是临时表,
在having前已经产生了数据,所以可以用别名,但SQL Sever不可以,SQL是在having后才Select。



