oracle排序后查询前10条记录

时间:2021-09-08 15:01:19
在sql server中: 
select top 10 from users;

而在oracle上网搜到的是:
select * from (select * from users order by userid desc) where rownum<=5;
或select * from users where rownum<=5 order by userid desc;

为什么在from后面可以写select语句啊, 哪位高手解释一下原理? from后面不是接表名吗?  
以上两种查询有什么区别? 分别有在什么场合?

10 个解决方案

#1


from 后面跟select是子查询,用的很多,尤其是类似于TOT,或者多表关联查询

你这两句出来的结果有区别
假设数据
userid
1
3
2
8
6
7
9
5
4

第一句出来的结果是
userid
9
8
7
6
5
第二句出来的结果是
8
6
3
2
1

说明下,rownum可以看作个隐藏的字段,是当前显示的行号,第一句是先降序后,再取rownum的前五位
原始数据
userid rownum
1       1
3       2
2       3
8       4
6       5
7       6
9       7
5       8
4       9
先降序后就变成了
userid rownum
9       1
8       2
7       3
6       4
5       5
4       6
3       7
2       8
1       9
所以出来的结果就是
userid
9
8
7
6
5
而第二句先取前五位,再排序就是

userid rownum
1       1
3       2
2       3
8       4
6       5
然后降序
8
6
3
2
1

#2


两种语法主要用途当然是取最前面的5条纪录,不过目地不同,用法不同

如果只是取查询结果的前五位,那就先ROWNUM再ORDER BY
如果是要取号码最大或者最小的前五位,就必须先ORDER BY再取ROWNUM<=5,要注意的是rownum不能直接跟在order by后面,所以要有子查询

#3


为什么在from后面可以写select语句啊
=================================
这就是内嵌视图,这里的select 语句可以看作一个视图。


select   *   from   users   where   rownum <=5   order   by   userid   desc;
=============================================================
取排序前的前5条记录(很少用)


select   *   from   (select   *   from   users   order   by   userid   desc)   where   rownum <=5; 
==============================================================================
取排序后的前5条记录(经常用)

#4


关于这两个语句的执行过程和区别Floor All Above都做了分析
我想说的是from后面为什么一定要跟表呢?不是很像嵌套嘛.如果一张表里可以解决所有查询...
那自然不会有子查询(Subqueries) 、各种Join,Union之类、各种分析函数(Analytic Functions)等等了 ~

可能你习惯了如下的查询:


--:求供应工程J1零件为红色的供应商号SNO

select distinct sno
from spj,p
where spj.jno='j1'
and spj.pno=p.pno
and color='红';

--事实上下面的则更高效

select distinct sno
from spj
where jno='j1'
and exists
(select *
from p
where spj.pno=p.pno and color='红');

--或者

 select distinct sno
 from spj
 where jno='j1'
 and pno in
 (select pno 
 from p
 where color='红');


#5


不错,感谢楼上的朋友,给了我很多启发

#6


KAO
居然是半年多前的贴子,此楼主居然都没结贴,楼主被列为不予回答的行列

#7


学习

#8


结帖有分吗
引用 6 楼  的回复:
KAO
居然是半年多前的贴子,此楼主居然都没结贴,楼主被列为不予回答的行列

#9


引用 8 楼  的回复:
结帖有分吗


 我勒个去  快5年的帖子也能被你挖出来  不学挖土机专业真是浪费了 oracle排序后查询前10条记录

#10


擦 我也是来接分的

#1


from 后面跟select是子查询,用的很多,尤其是类似于TOT,或者多表关联查询

你这两句出来的结果有区别
假设数据
userid
1
3
2
8
6
7
9
5
4

第一句出来的结果是
userid
9
8
7
6
5
第二句出来的结果是
8
6
3
2
1

说明下,rownum可以看作个隐藏的字段,是当前显示的行号,第一句是先降序后,再取rownum的前五位
原始数据
userid rownum
1       1
3       2
2       3
8       4
6       5
7       6
9       7
5       8
4       9
先降序后就变成了
userid rownum
9       1
8       2
7       3
6       4
5       5
4       6
3       7
2       8
1       9
所以出来的结果就是
userid
9
8
7
6
5
而第二句先取前五位,再排序就是

userid rownum
1       1
3       2
2       3
8       4
6       5
然后降序
8
6
3
2
1

#2


两种语法主要用途当然是取最前面的5条纪录,不过目地不同,用法不同

如果只是取查询结果的前五位,那就先ROWNUM再ORDER BY
如果是要取号码最大或者最小的前五位,就必须先ORDER BY再取ROWNUM<=5,要注意的是rownum不能直接跟在order by后面,所以要有子查询

#3


为什么在from后面可以写select语句啊
=================================
这就是内嵌视图,这里的select 语句可以看作一个视图。


select   *   from   users   where   rownum <=5   order   by   userid   desc;
=============================================================
取排序前的前5条记录(很少用)


select   *   from   (select   *   from   users   order   by   userid   desc)   where   rownum <=5; 
==============================================================================
取排序后的前5条记录(经常用)

#4


关于这两个语句的执行过程和区别Floor All Above都做了分析
我想说的是from后面为什么一定要跟表呢?不是很像嵌套嘛.如果一张表里可以解决所有查询...
那自然不会有子查询(Subqueries) 、各种Join,Union之类、各种分析函数(Analytic Functions)等等了 ~

可能你习惯了如下的查询:


--:求供应工程J1零件为红色的供应商号SNO

select distinct sno
from spj,p
where spj.jno='j1'
and spj.pno=p.pno
and color='红';

--事实上下面的则更高效

select distinct sno
from spj
where jno='j1'
and exists
(select *
from p
where spj.pno=p.pno and color='红');

--或者

 select distinct sno
 from spj
 where jno='j1'
 and pno in
 (select pno 
 from p
 where color='红');


#5


不错,感谢楼上的朋友,给了我很多启发

#6


KAO
居然是半年多前的贴子,此楼主居然都没结贴,楼主被列为不予回答的行列

#7


学习

#8


结帖有分吗
引用 6 楼  的回复:
KAO
居然是半年多前的贴子,此楼主居然都没结贴,楼主被列为不予回答的行列

#9


引用 8 楼  的回复:
结帖有分吗


 我勒个去  快5年的帖子也能被你挖出来  不学挖土机专业真是浪费了 oracle排序后查询前10条记录

#10


擦 我也是来接分的