MySQL Group By和HAVING

kim*_*thy 6 mysql group-by having

我是一个MySQL查询noobie所以我敢肯定这是一个明显答案的问题.

但是,我正在研究这两个问题.他们会返回不同的结果集吗?我知道排序过程会以不同的方式开始,但我相信它们会返回相同的结果,第一个查询的效率稍高一些吗?

查询1:HAVING,然后是AND

SELECT user_id   
FROM forum_posts  
GROUP BY user_id 
    HAVING COUNT(id) >= 100   
    AND user_id NOT IN (SELECT user_id FROM banned_users)
Run Code Online (Sandbox Code Playgroud)

查询2:在哪里,然后是HAVING

SELECT user_id   
FROM forum_posts 
WHERE user_id NOT IN(SELECT user_id FROM banned_users) 
GROUP BY user_id 
    HAVING COUNT(id) >= 100   
Run Code Online (Sandbox Code Playgroud)

a1e*_*x07 1

实际上,第一个查询的效率会较低(HAVING在之后应用WHERE)。
更新

一些伪代码来说明如何执行查询([非常]简化的版本)。
第一个查询:
1. SELECT user_id FROM forum_posts
2. SELECT user_id FROM banned_user
3. 分组、计数等。
4. 如果记录出现在第二个结果集中,则从第一个结果集中排除记录

第二个查询
1. SELECT user_id FROM forum_posts
2. SELECT user_id FROM banned_user
3. 如果记录出现在第二个结果集中,则从第一个结果集中排除记录
4. 分组、计数等。

步骤1,2的顺序并不重要,mysql可以选择它认为更好的任何内容。重要的区别在于步骤 3,4。已在 后应用GROUP BY。分组通常比联接更昂贵(在这种情况下排除记录可以被视为联接操作),因此分组的记录越少,性能越好。