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

时间:2021-04-20 12:54:57
有一个表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 * 的执行过程?

18 个解决方案

#1


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> 

#2


你好。能解释一下select top n的执行过程吗?
引用 1 楼 fredrickhu 的回复:
SQL code
SQL Select语句完整的执行顺序: 

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


另外:一个查询语句……

#3


<=5条记录,两个查询肯定一样,这还能有错?

#4


ls说的对啊,大于5条的话应该是先排序在取top的

#5


top是针对order by 的,先排序后取前n个。

#6


引用楼主 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所说的不一样,是不是指顺序不一样?

#7


经过测试,有重复数据顺序是会不一样

#8


经过测试,排序列中有重复数据的同样两个查询 顺序是会不一样

#9


引用 3 楼 dawugui 的回复:
<=5条记录,两个查询肯定一样,这还能有错?

你好,查出来的结果顺序有差别,但都是那几条记录。我就是想问,查出来的顺序怎么会不一样。

#10


引用 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所说的不一样,是不是指顺序不一样?

你好。我是那个意思,只是开始没有描述清楚。我想问一下,为什么顺序会有区别?

#11


引用 7 楼 zshsuming 的回复:
经过测试,有重复数据顺序是会不一样

你好,我就是想问一下,顺序为什么会不一样?

#12


引用 11 楼 ningweidong 的回复:
引用 7 楼 zshsuming 的回复:
经过测试,有重复数据顺序是会不一样

你好,我就是想问一下,顺序为什么会不一样?

表中的数据本来就是无序的

#13


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,保证排序记录唯一

#14


先进行排序查询,在取出前n条

#15


select * from t order by pid desc 
select top 5 * from t order by pid desc----先取前5条,再排序

#16


引用 15 楼 maonongwu 的回复:
select * from t order by pid desc 
select top 5 * from t order by pid desc----先取前5条,再排序

你好。有没有办法,让它先排序,再取前5条?

#17



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条,返回无序集合


对无序集合,其显示顺序是不确定的。

#18


引用 16 楼 ningweidong 的回复:
引用 15 楼 maonongwu 的回复:
select * from t order by pid desc
select top 5 * from t order by pid desc----先取前5条,再排序

你好。有没有办法,让它先排序,再取前5条?

select top 5 * from t order by pid desc
这条就是先排序,再取前5条,使用top的时候,如果order列中有重复,则相同项的顺序不确定

#1


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> 

#2


你好。能解释一下select top n的执行过程吗?
引用 1 楼 fredrickhu 的回复:
SQL code
SQL Select语句完整的执行顺序: 

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


另外:一个查询语句……

#3


<=5条记录,两个查询肯定一样,这还能有错?

#4


ls说的对啊,大于5条的话应该是先排序在取top的

#5


top是针对order by 的,先排序后取前n个。

#6


引用楼主 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所说的不一样,是不是指顺序不一样?

#7


经过测试,有重复数据顺序是会不一样

#8


经过测试,排序列中有重复数据的同样两个查询 顺序是会不一样

#9


引用 3 楼 dawugui 的回复:
<=5条记录,两个查询肯定一样,这还能有错?

你好,查出来的结果顺序有差别,但都是那几条记录。我就是想问,查出来的顺序怎么会不一样。

#10


引用 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所说的不一样,是不是指顺序不一样?

你好。我是那个意思,只是开始没有描述清楚。我想问一下,为什么顺序会有区别?

#11


引用 7 楼 zshsuming 的回复:
经过测试,有重复数据顺序是会不一样

你好,我就是想问一下,顺序为什么会不一样?

#12


引用 11 楼 ningweidong 的回复:
引用 7 楼 zshsuming 的回复:
经过测试,有重复数据顺序是会不一样

你好,我就是想问一下,顺序为什么会不一样?

表中的数据本来就是无序的

#13


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,保证排序记录唯一

#14


先进行排序查询,在取出前n条

#15


select * from t order by pid desc 
select top 5 * from t order by pid desc----先取前5条,再排序

#16


引用 15 楼 maonongwu 的回复:
select * from t order by pid desc 
select top 5 * from t order by pid desc----先取前5条,再排序

你好。有没有办法,让它先排序,再取前5条?

#17



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条,返回无序集合


对无序集合,其显示顺序是不确定的。

#18


引用 16 楼 ningweidong 的回复:
引用 15 楼 maonongwu 的回复:
select * from t order by pid desc
select top 5 * from t order by pid desc----先取前5条,再排序

你好。有没有办法,让它先排序,再取前5条?

select top 5 * from t order by pid desc
这条就是先排序,再取前5条,使用top的时候,如果order列中有重复,则相同项的顺序不确定