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的执行过程吗?
#3
<=5条记录,两个查询肯定一样,这还能有错?
#4
ls说的对啊,大于5条的话应该是先排序在取top的
#5
top是针对order by 的,先排序后取前n个。
#6
LZ所说的不一样,是不是指顺序不一样?
#7
经过测试,有重复数据顺序是会不一样
#8
经过测试,排序列中有重复数据的同样两个查询 顺序是会不一样
#9
你好,查出来的结果顺序有差别,但都是那几条记录。我就是想问,查出来的顺序怎么会不一样。
#10
你好。我是那个意思,只是开始没有描述清楚。我想问一下,为什么顺序会有区别?
#11
你好,我就是想问一下,顺序为什么会不一样?
#12
表中的数据本来就是无序的
#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条,再排序
select top 5 * from t order by pid desc----先取前5条,再排序
#16
你好。有没有办法,让它先排序,再取前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
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的执行过程吗?
#3
<=5条记录,两个查询肯定一样,这还能有错?
#4
ls说的对啊,大于5条的话应该是先排序在取top的
#5
top是针对order by 的,先排序后取前n个。
#6
LZ所说的不一样,是不是指顺序不一样?
#7
经过测试,有重复数据顺序是会不一样
#8
经过测试,排序列中有重复数据的同样两个查询 顺序是会不一样
#9
你好,查出来的结果顺序有差别,但都是那几条记录。我就是想问,查出来的顺序怎么会不一样。
#10
你好。我是那个意思,只是开始没有描述清楚。我想问一下,为什么顺序会有区别?
#11
你好,我就是想问一下,顺序为什么会不一样?
#12
表中的数据本来就是无序的
#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条,再排序
select top 5 * from t order by pid desc----先取前5条,再排序
#16
你好。有没有办法,让它先排序,再取前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
select top 5 * from t order by pid desc
这条就是先排序,再取前5条,使用top的时候,如果order列中有重复,则相同项的顺序不确定