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
你这两句出来的结果有区别
假设数据
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后面,所以要有子查询
如果只是取查询结果的前五位,那就先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条记录(经常用)
=================================
这就是内嵌视图,这里的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)等等了 ~
可能你习惯了如下的查询:
我想说的是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
结帖有分吗
#9
我勒个去 快5年的帖子也能被你挖出来 不学挖土机专业真是浪费了
#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
你这两句出来的结果有区别
假设数据
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后面,所以要有子查询
如果只是取查询结果的前五位,那就先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条记录(经常用)
=================================
这就是内嵌视图,这里的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)等等了 ~
可能你习惯了如下的查询:
我想说的是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
结帖有分吗
#9
我勒个去 快5年的帖子也能被你挖出来 不学挖土机专业真是浪费了
#10
擦 我也是来接分的