急问:select 和 order by 执行顺序的问题?

dongdandan 2013-04-10 09:09:51
select 姓名,电话 from Employees where 地址 ='北京' order by 编号 asc
据说select 优先级高于order by ,因此select 先执行,然后对结果order by .
但是如果是这样,上面的select 语句就应该是错的呀!因为结果中没有编号列。
而试验证明,确实是按照编号顺序排列了,请问是为什么?
...全文
2137 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongdandan 2013-04-10
  • 打赏
  • 举报
回复
非常感谢大家! 特别感谢SQL_Beginner的详细解释!
  • 打赏
  • 举报
回复
你的例子也是一样的,但是具体的PLAN要根据你的INDEX等所以可能有变化,所以我不好给出计划,从数据量的方向select 在order by之后执行,大体是这样的 select 姓名,电话 ------------------3 from Employees where 地址 ='北京'---1, order by 编号 asc-------------------2, 第1步取出 姓名,电话 ,编号 第2步取出 从第1步的输出“姓名,电话 ,编号”按编号排列。 第3步,select从第2步的结果去除 姓名,电话 ,丢掉编号。
  • 打赏
  • 举报
回复
很好理解的,你只要看数据流的方向就可以了 ,数据库的方向是从子节点到父节点,给你举个例子,
Use [AdventureWorks]
Go
Set statistics profile on
go
Select [Name] -----3
From [Production].[Product] ----1
order by [SellEndDate] ----2


从图中看出如下数据流,
第1步,Clustered Index Scan(From [Production].[Product]),再看一下输出是什么:是 [Name]跟 [SellEndDate] 两列,
第2步 ,Sort(order by [SellEndDate] ),对上面的输出 [Name]跟 [SellEndDate] 两列进行排列,并且是根据[SellEndDate] 排列,
第3步 ,Select 对Sort的输出选择1列,那就是NAME。
完毕。

zbdzjx 2013-04-10
  • 打赏
  • 举报
回复 1
那猜测一下。 如果SQL语句是:select 姓名,电话 from Employees where 地址 ='北京' 数据库在读每一条记录时,先读取“地址”一列,判断是不是需要的,如果是需要的,再读取“姓名”、“电话”两列。 如果SQL语句是:select 姓名,电话 from Employees where 地址 ='北京' order by 编号 asc 数据库在读每一条记录时,先读取“地址”一列,判断是不是需要的,如果是需要的,再读取“姓名”、“电话”、“编号”三列,全部读取完后,再按编号排序,再输出。 如果看查询计划应该能看出来吧。
dongdandan 2013-04-10
  • 打赏
  • 举报
回复
谢谢! 原来order by作用于源表和生成的结果集。具体怎么做的就不知道了,
MrYangkang 2013-04-10
  • 打赏
  • 举报
回复
你的理解有问题 ORDER BY子句中的表达式可以访问SELECT阶段的输入和输出虚拟表。 也就是说,可以在ORDER BY子句中指定任何可以在SELECT子句中使用的表达式。即:可以按不在最后返回结果集中的表达式来进行排序。
Mr_Nice 2013-04-10
  • 打赏
  • 举报
回复
--逻辑顺序是这样的

SELECT  姓名 ,        --3
        电话
FROM    Employees     --1
WHERE   地址 = '北京' --2
ORDER BY 编号 ASC     --4  ORDER BY 子句可包含未显示在选择列表中的项
参考http://msdn.microsoft.com/zh-cn/library/ms188385.aspx
昵称被占用了 2013-04-10
  • 打赏
  • 举报
回复
这个说起来复杂 如果编号有索引,而且索引包含地址、姓名,电话字段,直接扫描索引输出,已经按索引排序 如果编号有索引,而且索引不包含地址、姓名,电话等字段,可能查询的中间结果包含编号,然后使用这个索引排序,也可能不必使用索引,看开销估计。

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧