【发布时间】:2009-07-15 08:10:59
【问题描述】:
当我们将GROUP BY 和HAVING 与WHERE 子句一起使用时,我只是对SQL 查询的执行顺序感到困惑。哪个先被执行?顺序是什么?
【问题讨论】:
标签: sql sql-server sql-server-2005
当我们将GROUP BY 和HAVING 与WHERE 子句一起使用时,我只是对SQL 查询的执行顺序感到困惑。哪个先被执行?顺序是什么?
【问题讨论】:
标签: sql sql-server sql-server-2005
按顺序:
FROM 和 JOIN 确定和过滤行
WHERE 行上的更多过滤器
GROUP BY 将这些行组合成组
HAVING 过滤组
ORDER BY 排列剩余的行/组
LIMIT过滤剩余的行/组
【讨论】:
SET SHOWPLAN_ALL ON
这是 sql server 的完整序列:
1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE or WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
所以从上面的列表中,你可以很容易理解GROUP BY, HAVING and WHERE的执行顺序是:
1. WHERE
2. GROUP BY
3. HAVING
【讨论】:
SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val 这里是加入后ON,先选择,有什么解释吗?
FROM,然后是 ON,依此类推。
首先是 WHERE,然后对查询结果进行 GROUP,最后但并非最不重要的 HAVING 子句用于过滤分组结果。这是“合乎逻辑”的顺序,我不知道这在技术上是如何在引擎中实现的。
【讨论】:
【讨论】:
我认为它是在引擎中实现的,正如 Matthias 所说:WHERE、GROUP BY、HAVING
试图在网上找到列出整个序列的参考资料(即“SELECT”出现在底部),但我找不到。我不久前读过的一本“Inside Microsoft SQL Server 2005”一书中详细介绍了这一点,作者是 Solid Quality Learning
编辑:找到一个链接:http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx
【讨论】:
在下面的顺序中
【讨论】:
在 Oracle 12c 中,您可以按以下任一顺序运行代码:
Where
Group By
Having
或者
Where
Having
Group by
【讨论】:
想想如果你想实现你需要做什么:
顺序是 WHERE、GROUP BY 和 HAVING。
【讨论】:
Having 子句可能出现在 group by 子句之前/之前。
示例: 选择 * FROM test_std; ROLL_NO SNAME DOB TEACH
1 John 27-AUG-18 Wills
2 Knit 27-AUG-18 Prestion
3 Perl 27-AUG-18 Wills
4 Ohrm 27-AUG-18 Woods
5 Smith 27-AUG-18 Charmy
6 Jony 27-AUG-18 Wills
Warner 20-NOV-18 Wills
Marsh 12-NOV-18 Langer
FINCH 18-OCT-18 Langer
已选择 9 行。
select 教,count() 从 test_std 中计数 计数()> 1 按 TEACH 分组;
教数
朗格 2 遗嘱 4
【讨论】:
选择
来自
加入
在哪里
分组依据
有
订购方式
【讨论】: