在这个子查询中选择TOP

时间:2014-07-26 01:22:01

标签: sql

我正在从SQL书中学习SELECT 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

我不确定,但我认为有理由说作者写了第一个问题(他没有在他的书中解释)有人可以帮我解释一下为什么?我应该选择哪个查询?感谢

1 个答案:

答案 0 :(得分:0)

查询是等效的,优化器可能会导致在幕后执行相同的操作。

我很乐意认为作者正在展示关系代数的可组合性方面。他的版本正在进行查询,然后使用外部选择...按顺序编写它。这是关系代数中的一个强大功能,其中复杂集可以由更简单的代数构建。任何体面实现中的sql优化器(例如sql server,oracle等)都会将查询减少到最佳路径,因此您可以自由地以可理解的,可组合的方式编写查询,同时不会支付额外操作的代价。这实际上是关系代数的一个非常强大的属性。