rownum 表示行号,实际上此是一个列,可是这个列是一个伪列,此列能够在每张表中出现。sql
rowid 表示每一列对应的十六进制物理地址值spa
select e.*,rownum rn,rowid ri from emp e;blog
sq查询语句运行顺序排序
1.找到员工表中工资最高的三名员工,看第一段代码select
select * from (select ename,job,sal,rownum rn from emp order by sal desc) e where e.rn<4; sql语句
会发现咱们排序后取出来的结果并非工资最高的员工分页
2.分页显示数据,每页5条数据,查第二页数据语法
select e.*,rownum from emp e where rownum<=10 and rownum>5; 会报错im
根据sql语句的运行顺序,咱们就很好解释这两个问题出现的缘由了,第一个语句子查询语句先运行select后运行order by,因此行号是按开始的顺序排列的.数据
第二个语句先运行where条件,rownum是从1开始因此,>5永远为假
关于第一个问题最简单写法
select * from (select * from emp order by sal desc) where rownum<4; rownum是伪列在每张表中出现,因此能够直接使用;
第二个问题写法
select * from (select e.*, rownum rn from emp e) p where p.rn<=10 and p.rn>5;
3.对比一些代码,更多的了解一下rownum
select rownum from emp; 不报错
select e.rownum from emp e; 报错
emp表中没有rownum这一列,rownum只是一个伪列,每一张表中都有,但又不实际存在,因此能够直接查询,而不能够用表点查询
select e.*,rownum from emp e; 不报错
select *,rownum from emp; 报错
这个疑问是一个美女给我解答的,她说*已经表明全部,后面不能再加字段,会出现语法错误,表点星是表明这个表的全部列,后面能够再跟其余的字段
select * from (select ename,job,sal,rownum from emp order by sal desc) where rownum<5; 能够先猜测一下这个运行结果是什么
select * from (select ename,job,sal ,rownum from emp) p where p.rownum<5; 先猜测一下这个运行会不会报错.
上面两个问题第一个你会发现取出来的结果是工资最高的前四名员工,能够考虑一下缘由,判断条件的rownum是属于哪张表的rownum.
第二个问题会报错,报错缘由是字段重复或者说不知道去查询哪一个字段,p.rownum在一些人认为中是p表的rownum列,但其实p表还有一个伪列rownum.因此会形成冲突,解决办法就是用别名.