select top n * from和select * from的区别

ningweidong 2011-04-14 02:43:38
有一个表t
id name pid
1 张三 0
2 李四 0
3 王五 2

select * from t
和select top 5 * from t
查询到的结果是一样的

select * from t order by pid desc
和select top 5 * from t order by pid desc
查询到的结果就不一样了

我的理解select top n * 其实就是先执行select *,然后只显示前n条,但是为什么刚才的查询结果就不一样呢?是order的问题吗?谁能帮我解释一下select top n * 的执行过程?
...全文
2818 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Spade_J 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ningweidong 的回复:]
引用 15 楼 maonongwu 的回复:
select * from t order by pid desc
select top 5 * from t order by pid desc----先取前5条,再排序

你好。有没有办法,让它先排序,再取前5条?
[/Quote]
select top 5 * from t order by pid desc
这条就是先排序,再取前5条,使用top的时候,如果order列中有重复,则相同项的顺序不确定
feilniu 2011-04-15
  • 打赏
  • 举报
回复

select * from t
--取所有数据,返回无序集合
select top 5 * from t
--根据内部数据存储顺序取前5条,返回无序集合
select * from t order by pid desc
--取所有数据,按pid逆序返回有序列表
select top 5 * from t order by pid desc
--按pid逆序取前5条,返回无序集合


对无序集合,其显示顺序是不确定的。
ningweidong 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 maonongwu 的回复:]
select * from t order by pid desc
select top 5 * from t order by pid desc----先取前5条,再排序
[/Quote]
你好。有没有办法,让它先排序,再取前5条?
ABCDEF 2011-04-14
  • 打赏
  • 举报
回复
select * from t order by pid desc
select top 5 * from t order by pid desc----先取前5条,再排序
yy_453091010 2011-04-14
  • 打赏
  • 举报
回复
先进行排序查询,在取出前n条
Shawn 2011-04-14
  • 打赏
  • 举报
回复
CREATE TABLE t
(
id INT IDENTITY,
[name] NVARCHAR(10),
pid INT
)
INSERT t
SELECT N'张三', 0 UNION ALL
SELECT N'李四', 0 UNION ALL
SELECT N'王五', 2
GO
--SQL:
select * from t order by pid desc
select top 5 WITH TIES * from t order by pid DESC
select top 5 * from t order by pid desc
--#1. 在没有WITH TIES选项时,对于相同的pid,返回的记录好像是倒序(不解)
--#2. 对于top, order by,保证排序记录唯一
oO寒枫Oo 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ningweidong 的回复:]
引用 7 楼 zshsuming 的回复:
经过测试,有重复数据顺序是会不一样

你好,我就是想问一下,顺序为什么会不一样?
[/Quote]
表中的数据本来就是无序的
ningweidong 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zshsuming 的回复:]
经过测试,有重复数据顺序是会不一样
[/Quote]
你好,我就是想问一下,顺序为什么会不一样?
ningweidong 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 feilniu 的回复:]
引用楼主 ningweidong 的回复:
select * from t
和select top 5 * from t
查询到的结果是一样的

select * from t order by pid desc
和select top 5 * from t order by pid desc
查询到的结果就不一样了


LZ所说的不一样,是不是指顺序不一样?
[/Quote]
你好。我是那个意思,只是开始没有描述清楚。我想问一下,为什么顺序会有区别?
ningweidong 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
<=5条记录,两个查询肯定一样,这还能有错?
[/Quote]
你好,查出来的结果顺序有差别,但都是那几条记录。我就是想问,查出来的顺序怎么会不一样。
zshsuming 2011-04-14
  • 打赏
  • 举报
回复
经过测试,排序列中有重复数据的同样两个查询 顺序是会不一样
zshsuming 2011-04-14
  • 打赏
  • 举报
回复
经过测试,有重复数据顺序是会不一样
feilniu 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 ningweidong 的回复:]
select * from t
和select top 5 * from t
查询到的结果是一样的

select * from t order by pid desc
和select top 5 * from t order by pid desc
查询到的结果就不一样了
[/Quote]

LZ所说的不一样,是不是指顺序不一样?
叶子 2011-04-14
  • 打赏
  • 举报
回复
top是针对order by 的,先排序后取前n个。
yubofighting 2011-04-14
  • 打赏
  • 举报
回复
ls说的对啊,大于5条的话应该是先排序在取top的
dawugui 2011-04-14
  • 打赏
  • 举报
回复
<=5条记录,两个查询肯定一样,这还能有错?
ningweidong 2011-04-14
  • 打赏
  • 举报
回复
你好。能解释一下select top n的执行过程吗?
[Quote=引用 1 楼 fredrickhu 的回复:]
SQL code
SQL Select语句完整的执行顺序:

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


另外:一个查询语句……
[/Quote]
--小F-- 2011-04-14
  • 打赏
  • 举报
回复
SQL Select语句完整的执行顺序: 

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


另外:一个查询语句各个部分的执行顺序:
--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>

34,576

社区成员

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

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