Sql 在此子查询中选择TOP

Sql 在此子查询中选择TOP,sql,Sql,我正在学习从SQL书籍中选择TOP,作者编写了以下查询,以返回前10个状态的按状态排序的数量: SELECT state, numorders FROM (SELECT TOP 20 o.state, COUNT(*) as numorders FROM orders o GROUP BY o.state ORDER BY COUNT(*) DESC ) summary ORDER BY numorders desc 我不理解他的查询,我写了这个,这个查

我正在学习从SQL书籍中选择TOP,作者编写了以下查询,以返回前10个状态的按状态排序的数量:

SELECT state, numorders
FROM (SELECT TOP 20 o.state, COUNT(*) as numorders 
      FROM orders o
      GROUP BY o.state
      ORDER BY COUNT(*) DESC
 ) summary
ORDER BY numorders desc
我不理解他的查询,我写了这个,这个查询返回相同的结果:

SELECT TOP 20 o.state, COUNT(*) as numorders 
FROM orders o
GROUP BY o.state
ORDER BY COUNT(*) DESC

我不确定,但我认为作者写第一个问题的原因是他在书中没有解释的,有人能帮我解释一下为什么吗?我应该问哪一个问题?谢谢

这些查询是等价的,而一个优化者很可能会在幕后执行同样的操作

我倾向于认为作者正在演示关系代数的可组合性方面。他的版本是接受一个查询,然后用外部的select…ORDERBY组合它。这是关系代数中的一个强大功能,在关系代数中,复杂的集合可以由简单的集合组成。sql Optimizer在任何适当的实现(如sql server、oracle等)中都会将查询减少到最佳路径,因此您可以自由地以可理解、可组合的方式编写查询,而不必支付额外操作的代价。这实际上是关系代数的一个非常强大的属性