select 、distinct、order by的执行顺序

yubofighting 2011-09-20 05:17:59
select 、distinct、order by的执行顺序

标准的应该是先select,然后distinct,再order by

我这边有点疑问,既然已经执行了select,列已经选出来了,为什么下面的代码是对的

select id from test order by name

order by执行顺序应该在select之前吗?
...全文
2403 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
hepeng_8 2013-12-10
  • 打赏
  • 举报
回复
--8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list> --(1) FROM <left_table> --(3) <join_type> JOIN <right_table> --(2) ON <join_condition> --(4) WHERE <where_condition> --(5) GROUP BY <group_by_list> --(6) WITH {CUBE | ROLLUP} --(7) HAVING <having_condition> --(10) ORDER BY <order_by_list>
yao710452238 2011-10-06
  • 打赏
  • 举报
回复
先order by再select
用下面的语句,再看看结果就知道了
select top 3 * from student order by Sno desc
中国风 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qianjin036a 的回复:]

order by 是针对表列的,与是否为查询列好像无关吧.
[/Quote]

當加了 distinct 時就與 select 列有關了
净灵 2011-09-21
  • 打赏
  • 举报
回复
以前我用PB或TOAD的时候一般是检索出来了,再排序的
yubofighting 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 rich_er 的回复:]
Order by >distinct>select
[/Quote]
你逆序了吧
nijing490784796 2011-09-21
  • 打赏
  • 举报
回复
原来是这样的啊
睡羊羊老婆 2011-09-21
  • 打赏
  • 举报
回复
--8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
--(1) FROM <left_table>
--(3) <join_type> JOIN <right_table>
--(2) ON <join_condition>
--(4) WHERE <where_condition>
--(5) GROUP BY <group_by_list>
--(6) WITH {CUBE | ROLLUP}
--(7) HAVING <having_condition>
--(10) ORDER BY <order_by_list>


这个顺序是没错的,在查询的每个步骤中,按照这个顺序进行删选记录,形成虚拟表,包括select。最终得到满足所以条件的虚拟表,然后在投影出相应选择的列。

我是这样理解的!!!

可以看一下《sqlserver 2005 技术内幕 T-SQL查询》第一章 逻辑查询,那里面有记载,希望我理解的对,O(∩_∩)O~
Rich_er 2011-09-20
  • 打赏
  • 举报
回复
Order by >distinct>select
yubofighting 2011-09-20
  • 打赏
  • 举报
回复
我多嘴了,晴大的回答最符合这个问题。。。
中国风 2011-09-20
  • 打赏
  • 举报
回复
執行策略
1、在 FROM 子句中產生資料表的聯結。若使用明確的 JOIN 語法,則 JOIN 的結果就很明顯。如果 FROM 字句中含有多個以逗號分隔的資料表名稱,這就是資料表的隱含式跨產品聯結。


2、若有 WHERE 子句,便對步驟 1 所得結果的資料列執行搜尋條件,只保留符合條件的資料列。


3、如果 SELECT 子句中沒有任何彙總運算,而且如果沒有 GROUP BY 子句,則跳到步驟 7。


4、如果有 GROUP BY 子句,則會將步驟 2 運算所得的資料列分為多個群組,因此所有群組資料行在每一個群組的所有資料列中具有相同的值。如果沒有 GROUP BY 子句,則將所有資料列放入一個群組中。


5、若有指定 HAVING 子句,則針對步驟 4 所產生的每一個群組套用 HAVING 子句,只有符合 HAVING 子句的群組才會被保留。


6、對於步驟 5 所產生的每一個群組,根據該群組評估來自 SELECT 子句中的選取清單,以便只產生一個結果資料列。


7、若 SELECT 子句包含 DISTINCT 關鍵字,則在步驟 6 所得的結果中刪除重複的資料列。


8、如果有 ORDER BY 子句,則根據其順序運算式所指定的方式排列步驟 7 的結果。


chuanzhang5687 2011-09-20
  • 打赏
  • 举报
回复
chuanzhang5687 2011-09-20
  • 打赏
  • 举报
回复
select distinct id from tb order by id,name
/*
消息 145,级别 15,状态 1,第 1 行
如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中。
geniuswjt 2011-09-20
  • 打赏
  • 举报
回复
是先select出来id,然后再将结果按id对应的name排序而已...[Quote=引用楼主 yubofighting 的回复:]
select 、distinct、order by的执行顺序

标准的应该是先select,然后distinct,再order by

我这边有点疑问,既然已经执行了select,列已经选出来了,为什么下面的代码是对的

select id from test order by name

order by执行顺序应该在select之前吗?
[/Quote]
yubofighting 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 yubofighting 的回复:]
select 、distinct、order by的执行顺序

标准的应该是先select,然后distinct,再order by

我这边有点疑问,既然已经执行了select,列已经选出来了,为什么下面的代码是对的

select id from test order by name

order by执行顺序应该在select之前吗?
[/Quote]

可能我没将清楚,test表包括两列,分别是id和name列
yubofighting 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 geniuswjt 的回复:]
lz参考这个

引用 3 楼 fredrickhu 的回复:
SQL code
SQL Select语句完整的执行顺序:

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order ……
[/Quote]

我知道执行顺序,正因为知道执行顺序,所以才有疑问。。。。
yubofighting 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fredrickhu 的回复:]
SQL code
----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2011-09-20 17:25:29
-- Verstion:
-- Microsoft SQL Server 2008 R2 (RTM) ……
[/Quote]

我的name列相当于你的col列
geniuswjt 2011-09-20
  • 打赏
  • 举报
回复
lz参考这个[Quote=引用 3 楼 fredrickhu 的回复:]
SQL code
SQL Select语句完整的执行顺序:

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。


另外:一个查询语句……
[/Quote]
--小F-- 2011-09-20
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2011-09-20 17:25:29
-- Verstion:
-- Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86)
-- Apr 22 2011 11:57:00
-- Copyright (c) Microsoft Corporation
-- Enterprise Evaluation Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([id] int,[col] int)
insert [tb]
select 1,4 union all
select 1,4 union all
select 2,5 union all
select 3,6
--------------开始查询--------------------------
select id from tb order by name
----------------结果----------------------------
/* 消息 207,级别 16,状态 1,第 8 行
列名 'name' 无效。

*/
chuanzhang5687 2011-09-20
  • 打赏
  • 举报
回复
SQL Select语句完整的执行顺序:

1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组;
6、计算所有的表达式;
7、使用order by对结果集进行排序。

加载更多回复(3)

34,872

社区成员

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

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