1. oracle和sql server取第一条记录的区别以及rownum详解
我们知道学生可能有重名的情况,那么当重名的时候假设只需要取得重名结果集中的第一条记录。
sql server:
select top(1) num,Name from M_Student where name = 'xy'
Oracle:
select num,Name from M_Student where name = 'xy' and rownum <= 1
对于rownum在oracle的使用的时候,有几点需要注意:
(1) rownum 对于等于某值的查询条件
如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。
(2) rownum对于大于某值的查询条件
如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。
(3) rownum对于小于某值的查询条件
rownum对于rownum<n(n>1的自然数)的条件认为是成立的,所以可以找到记录。比如 rownum < 3
(4) rownum和排序
Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。
select rownum ,id,name from student order by name;
ROWNUM ID NAME
3 200003 李三
2 200002 王二
1 200001 张一
4 200004 赵四
可以看出rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。必须使用子查询。
select rownum ,id,name from (select * from student order by name);
ROWNUM ID NAME
3 200003 李三
2 200002 王二
1 200001 张一
4 200004 赵四
这样就成了按name排序,并且用rownum标出正确序号(由小到大)
看一个例子
把最先进入公司的5个人找出来
方法一 SELECT * FROM emp WHERE ROWNUM <= 5 ORDER BY hiredate;
方法二 SELECT * FROM(SELECT * FROM emp ORDER BY hiredate) WHERE ROWNUM <= 5;
把最先进入公司的6-10个人找出来
方法一
SELECT * FROM (SELECT * FROM emp ORDER BY hiredate)
WHERE ROWNUM <= 10
MINUS
SELECT * FROM (SELECT * FROM emp ORDER BY hiredate)
WHERE ROWNUM <= 5;
方法二(分页常用)
SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHERE ROWNUM <= 10) t WHERE t.rn >= 6;
SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT ename, sal FROM emp) e WHERE ROWNUM <= 10) WHERE rn >= 6;
2. 跪求一句SQL代码(Oracle Rownum)
select b.nn,a.CoustmerID ,a.OrderID
from 订单表 a,
(select c.CoustmerID,rownum as nn from 客户表 c) b
where a.CoustmerID = b.CoustmerID
其实只要把客户表中的CoustmerID 和rownum查出了,做为结果集联合订单表就可以了
-------------------上面的语句我用其他表试了,没有问题
想知道你是oracle数据库吗?
还是其他数据库,想做到oracle的rownum效果?
3. oracle数据库中表的第一列是不是rownum
oracle 中的 rownum 是伪列,不属于某一张表。
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀。
所以它更不是表中的第一列。
4. sql中有没有类似于oracle中rownum的函数
SQL Server 2000中没有SQL Server 2005中有一个ROW_NUMBER()函数实现了相同的功能 ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> ) 参数 <partition_by_clause> 将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。有关 PARTITION BY 的语法,请参阅 OVER 子句 (Transact-SQL)。 <order_by_clause>确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。当在排名函数中使用 <order_by_clause> 时,不能用整数表示列。 返回类型 bigint 备注 ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。 参考: http://msdn.microsoft.com/zh-cn/library/ms186734(SQL.90).aspx
5. 关于oracle中使用rownum的问题
除了索引组织表(IOT),其他的表存储都是堆表(Heap表)是无序的,查询出的数据不一定就是入库顺序,切记
所以 用rownum 最好加上order by
解决方案:
查询:
select * from table_a where
rowid in ( select rowid from table_a where rownum <= 2000 order by id)
删除:
delete from table_a where
rowid in ( select rowid from table_a where rownum <= 2000 order by id)
这里按照id 排序,因为id是有索引的,索引本身就是有序的,所以 order by id 不会产生性能问题
6. SQL中ROWNUM是做什么的有什么作用
ORACLE中,ROWNUM像一个隐藏的字段。记录的是行数。
SELECT ROWNUM,A.* FROM TABLE A 就出来了
可以查第几条数据,如:
select * from (SELECT ROWNUM rn,A.* FROM TABLE A )b where b.rn=你要查询的行数
7. sql中有没有类似于oracle中rownum的函数
Oracle
row_number()函数用法
row_number()over(partition
by
col1
order
by
col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。
与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码。
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开始排序)。
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
dense_rank()也是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的。
oracle
分析函数
row_number(),返回一个整数值(>=1);
语法格式:
row_number()
over
(order
by
col_1[,col_2
...])
作用:按照col_1[,col_2
...]排序,返回排序后的结果集。
8. Oracle数据库rownum和row_number的不同点
明确对于rownum
来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是二,以此类推,这个为字段可以用于限制查询的返回的总行数,因为rownum总是从1开始,但是1以上的自然数在rownum
做等于判断时都认为是false
条件,所以无法查到
rownum=n
(n》1的自然数),所以查找第二行以后的记录可以用子查询方法来解决,给子查询中的rownum取别名;对于小于某个值的情况两种方法都差不多,但是对于某个不等于一的值或者求某个值到某个值之间的情况,用row_number()
别名获得排名
,比用rownum伪列要简单方便的多;因为伪列总是从一开始查找;
具体用法和区别参见以下代码;
--取出工资最高的前5位
select
empno,ename,sal,rownum
from
emp;
select
*
from
(select
*
from
emp
order
by
sal
desc)
where
rownum<=5;
select
*
from
(select
ename,sal,row_number()
over(order
by
sal
desc)
as
num
from
emp)
where
num<=5;
select
*
from
(select
ename,sal,row_number()
over(order
by
sal
desc)
from
emp)
where
rownum<=5
--工资的前3名
select
*
from
emp
where
sal
>=any(select
*
from
(select
sal
from
emp
order
by
sal
desc)
where
rownum<=3);
select
*
from(select
*
from
emp
order
by
sal
desc)
where
rownum
<4;
select
*
from
(select
ename,sal,empno,deptno
,row_number()
over
(order
by
sal
desc)
from
emp)
where
rownum<4;
select
*
from
(select
ename,sal,empno,deptno
,row_number()
over
(order
by
sal
desc)
as
num
from
emp)
where
num<4
--按照工资排序,取出第6名到第10名
--使用伪列获得
select
*
from
(select
ename,sal,rownum
r
from
(select
*
from
emp
order
by
sal
desc)
where
rownum<=10)
where
r>5;
--使用排名函数获得
select
*
from
(select
ename,sal,row_number()
over(order
by
sal
desc)
as
num
from
emp)
where
num>5
and
num<=10;
-------
按工资从高到低获得工资排名第四的员工
select
*
from
(select
ename,sal,row_number()
over(order
by
sal
desc)
as
num
from
emp)
where
num=4;
select
*
from
(select
ename,sal,rownum
r
from
(select
*
from
emp
order
by
sal
desc)
where
rownum<=4)
where
r=4;
总结oracle中rownum和row_number()的区别
row_number()是分析函数,基本语法为row_number()
over(partition
by
字段
order
by
字段)
rownum是一个伪列
select
*
from
dept
where
rownum<=3;
select
*
from
dept
where
rownum
between
2
and
3;这儿会出错,因为rownum的特性(没有1就不会有2,没有3)决定的
SELECT
*
FROM
(SELECT
A.*,ROWNUN
FROM
DEPT
A)T1
WHERE
T1.ROWNUM
BETWEEN
2
AND
3;这么写不对,要这样写
SELECT
*
FROM
(SELECT
A.*,ROWNUM
RN
FROM
DEPT
A)T1
WHERE
T1.RN
BETWEEN
2
AND
3;
他们的主要区别是:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而函数row_number()在包含排序从句后是先排序再计算行号码。
9. oracle的sql 以下rownum=1 怎么换成db2的写法
select t.* from (select CASH_ID,row_number() over() as rown from
STL_FIN_PRODUCT_ACCT ,fin_proct
where STL_FIN_PRODUCT_ACCT.FINPROD_ID = fin_proct.finprod_id
and fin_proct.p_finprod_id = STL_FIN_PRODUCT_ACCT.FINPROD_ID
and STL_FIN_PRODUCT_ACCT.ACCT_NO = STL_FIN_PRODUCT_ACCT.ACCT_NO
and STL_FIN_PRODUCT_ACCT.ACCT_TYPE = STL_FIN_PRODUCT_ACCT.ACCT_TYPE
and CASH_ID is not null
) t where t.rown = 1
10. oracle中使用rownum分页,请教一下数据的顺序会变吗
第一次的rownum是oracle中的一个虚拟列你说的rn是给这个rownum起的别名,也就是在子查询中的别名要在外查询中调用oracle中的分页查询不止是只有rownum还可以用row_number等函数(不过这个是根据某个字段排序后的排名,这个在数据量较大的情况下很影响查询效率),不过这个的调用方式也跟上边的那个类似,并且,这个row_number函数在sqlserver中也是可以使用的,具体的你可以搜索一下