我是MySQL的新手,在学习GROUP BY / HAVING时我遇到过这个问题:
SELECT author_id, COUNT(author_id) FROM posts GROUP BY author_id HAVING COUNT(author_id) > 2;
我发现了一篇关于SQL执行顺序的文章,该文章说顺序如下:
FROM子句 - > WHERE子句 - > GROUP BY子句 - > HAVING子句 - > SELECT子句 - > ORDER BY子句
但如果是这样,下一个查询怎么能成功执行呢?
SELECT author_id, COUNT(author_id) AS posts_count
FROM posts
GROUP BY author_id
HAVING posts_count > 2;
如果在HAVING
之后执行SELECT
,HAVING
如何知道“posts_count”别名?我发现的信息是不正确的还是这是某种与SQL标准不同的MySQL特定行为?
此外,如果HAVING
在第二个查询中使用posts_count
中的“SELECT
”别名,我可以猜测HAVING
将无法运行{{1再次过滤组,只从“post_count”列中获取必要的数据。但是,COUNT()
会在第一个查询中执行相同的操作,或者每个组会HAVING
两次(COUNT()
中的第一个,SELECT
中的第二个),使查询执行时间更长?
我很抱歉可能会用错误的名字来调用一些东西,我只是在学习MySQL的开始:)
答案 0 :(得分:0)
你说得对,执行顺序是:
问题是,如果您使用别名运行查询在T-SQL(SQL Server)中无效,因为HAVING指的是SELECT别名posts_count。
然而,在MySQL中是不同的。 MySQL扩展了标准SQL行为,允许在聚合列的HAVING子句中使用别名。
查看此处的最后一个示例:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html