2016-07-27 69 views
0

我在MySQL相当新手在学习GROUP BY/HAVING我面对这个查询:MySQL首先执行什么操作:SELECT或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知道 “POSTS_COUNT” 的别名,如果SELECTHAVING后执行?我发现的信息是不正确的还是这是某种与SQL标准不同的MySQL特定行为?

而且,如果HAVING使用从SELECTposts_count”的别名在第二个查询,我可以做一个野生猜测,HAVING将不再运行COUNT()筛选组,将只取“POST_COUNT”列必要的数据。但是,HAVING会在第一个查询中做同样的事情,还是会为每个组运行COUNT()两次(SELECT中的第一个和HAVING中的第一个),从而使查询执行时间更长?

我很抱歉可能调用一些事情错了名字,我只在我的MySQL学习:)

回答

0

的beginnig你是正确的执行顺序是:

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. 选择
  6. ORDER BY

问题是,如果你运行你的查询别名将在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

+0

谢谢你的解释,这正是我一直在寻找! – Eyeless

相关问题