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之前吗?
...全文
2252 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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,871

社区成员

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

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