扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
oracle 函数中没有top命令。
创新互联公司专业为企业提供太和网站建设、太和做网站、太和网站设计、太和网站制作等企业网站建设、网页设计与制作、太和企业网站模板建站服务,十余年太和做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
Oracle8i可以将一个查询到的数据集作为另外一个查询的表名,于是可以解决Top N的一条SQL查询,例如,从tab表中取出f字段值最大的10条记录:
SELECT * FROM (SELECT * FROM tab ORDER BY f DESC) WHERE ROWNUM = 10。
oracle简介:
甲骨文公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989年正式进入中国市场。2013年,甲骨文已超越 IBM ,成为继 Microsoft 后全球第二大软件公司。
通过
SecureCRT
.exe连接linux操作系统。
切换到oracle
用户。
输入
su
oracle
打开监听。
输入
lsnrctl
start
。
监听启动成功。
显示如下图。
打开sqlplus
程序。
输入
sqlplus
/nolog
进入sqlplus界面。
在sqlplus连接数据库。
输入
connect
/as
sysdba.
显示连接成功。
输入startup
,启动oracle
数据库。
查看oracle
数据库是否启动成功。
退出sqlplus界面,并输入top命令。查看是否有oracle的进程。
1.在ORACLE中实现SELECT TOP N
由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询。
简单地说,实现方法如下所示:
SELECT 列名1...列名n FROM
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM = N(抽出记录数)
ORDER BY ROWNUM ASC
下面举个例子简单说明一下。
顾客表customer(id,name)有如下数据:
ID NAME
01 first
02 Second
03 third
04 forth
05 fifth
06 sixth
07 seventh
08 eighth
09 ninth
10 tenth
11 last
则按NAME的字母顺抽出前三个顾客的SQL语句如下所示:
SELECT * FROM
(SELECT * FROM CUSTOMER ORDER BY NAME)
WHERE ROWNUM = 3
ORDER BY ROWNUM ASC
输出结果为:
ID NAME
08 eighth
05 fifth
01 first
2.在TOP N纪录中抽出第M(M = N)条记录
在得到了TOP N的数据之后,为了抽出这N条记录中的第M条记录,我们可以考虑从ROWNUM着手。我们知道,ROWNUM是记录表中数据编号的一个隐藏子段,所以可以在得到TOP N条记录的时候同时抽出记录的ROWNUM,然后再从这N条记录中抽取记录编号为M的记录,即使我们希望得到的结果。
从上面的分析可以很容易得到下面的SQL语句。
SELECT 列名1...列名n FROM
(
SELECT ROWNUM RECNO, 列名1...列名nFROM
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM = N(抽出记录数)
ORDER BY ROWNUM ASC
)
WHERE RECNO = M(M = N)
同样以上表的数据为基础,那么得到以NAME的字母顺排序的第二个顾客的信息的SQL语句应该这样写:
SELECT ID, NAME FROM
(
SELECT ROWNUM RECNO, ID, NAME FROM
(SELECT * FROM CUSTOMER ORDER BY NAME)
WHERE ROWNUM = 3
ORDER BY ROWNUM ASC )
WHERE RECNO = 2
结果则为:
ID NAME
05 fifth
3.抽出按某种方式排序的记录集中的第N条记录
在2的说明中,当M = N的时候,即为我们的标题讲的结果。实际上,2的做法在里面NM的部分的数据是基本上不会用到的,我们仅仅是为了说明方便而采用。
如上所述,则SQL语句应为:
SELECT 列名1...列名n FROM
(
SELECT ROWNUM RECNO, 列名1...列名nFROM
(SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM = N(抽出记录数)
ORDER BY ROWNUM ASC
)
WHERE RECNO = N
那么,2中的例子的SQL语句则为:
SELECT ID, NAME FROM
(
SELECT ROWNUM RECNO, ID, NAME FROM
(SELECT * FROM CUSTOMER ORDER BY NAME)
WHERE ROWNUM = 2
ORDER BY ROWNUM ASC
)
WHERE RECNO = 2
结果为:
ID NAME
05 fifth
4.抽出按某种方式排序的记录集中的第M条记录开始的X条记录
3里所讲得仅仅是抽取一条记录的情况,当我们需要抽取多条记录的时候,此时在2中的N的取值应该是在N = (M + X - 1)这个范围内,当让最经济的取值就是取等好的时候了的时候了。当然最后的抽取条件也不是RECNO = N了,应该是RECNO BETWEEN M AND (M + X - 1)了,所以随之而来的SQL语句则为:
SELECT 列名1...列名n FROM
(
SELECT ROWNUM RECNO, 列名1...列名nFROM
(
SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
WHERE ROWNUM = N (N = (M + X - 1))
ORDER BY ROWNUM ASC
)
WHERE RECNO BETWEEN M AND (M + X - 1)
同样以上面的数据为例,则抽取NAME的字母顺的第2条记录开始的3条记录的SQL语句为:
SELECT ID, NAME FROM
(
SELECT ROWNUM RECNO, ID, NAME FROM
(SELECT * FROM CUSTOMER ORDER BY NAME)
WHERE ROWNUM = (2 + 3 - 1)
ORDER BY ROWNUM ASC
)
WHERE RECNO BETWEEN 2 AND (2 + 3 - 1)
结果如下:
ID NAME
05 fifth
01 first
04 forth
以此为基础,再扩展的话,做成存储过程,将开始记录数以及抽取记录数为参数,就可以轻松实现分页抽取数据。
当然了,上面所讲的都是一些最基本的,实际应用中往往都没有这么简单,但是不管怎么说,不管复杂的应用总是由这些简单的元素构成,掌握一些最基本的方法始终是重要的。
实际上网上这样的文章比较多,我也只是稍微梳理了一下条理而写的这篇文章。希望能给初学者一些帮助。
oracle中前N条数据可用row_number来实现。
如表中数据:
现在要求按照ID倒序,取出前十位:
oracle中执行方法:
select t.id,t.name from
(select test.*,row_number() over (order by id desc) rn from test) t
where rn=10;
结果:
很遗憾,不支持
但可以使用 order by 和rownum实现top功能
见资料:
rownum:对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。 example: select rownum as 行号,first_name as 员工姓名 from hr.employees select rownum as 行号,first_name as 员工姓名 from hr.employees order by 员工姓名; 序号不会重新排的,(所以需要嵌套一层子查询来抽取排序好的数据)原因下面解释。 例1:查询各个部门的MANAGER(经理)中谁的工资最低 hrselect * from(select t1.manager_id as 员工编号,t2.first_name as 员工姓名,t2.salary as 工资 from hr.departments t1 join hr.employees t2 on t1.manager_id=t2.employee_id order by t2.salary) where rownum=1; *******************************************************************************where rownum=1;表示取第一行, rownum2、=2什么的是不行的只能用
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流