MySQL首先执行什么:SELECT或HAVING?

时间:2016-07-27 05:21:12

标签: mysql

我是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之后执行SELECTHAVING如何知道“posts_count”别名?我发现的信息是不正确的还是这是某种与SQL标准不同的MySQL特定行为?

此外,如果HAVING在第二个查询中使用posts_count中的“SELECT”别名,我可以猜测HAVING将无法运行{{1再次过滤组,只从“post_count”列中获取必要的数据。但是,COUNT()会在第一个查询中执行相同的操作,或者每个组会HAVING两次(COUNT()中的第一个,SELECT中的第二个),使查询执行时间更长?

我很抱歉可能会用错误的名字来调用一些东西,我只是在学习MySQL的开始:)

1 个答案:

答案 0 :(得分:0)

你说得对,执行顺序是:

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. 选择
  6. ORDER BY
  7. 问题是,如果您使用别名运行查询在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