--rownum 行号(伪列)
关于rownum
1、rownum永远按照默认的顺序生成 (可以先进行子查询,在子查询的基础上添加行号rownum来改变子查询中的默认行号的顺序)
2、rownum只能使用<、<=;不能使用>、>= (因为rownum永远从1开始计数)
select rownum,empno,ename,sal
from (select * from emp order by sal desc) --表的行号是固定的,order by之后的行号顺序可能会乱套
where rownum<=3; --rownum是在子查询产生的新表的基础上添加的行号,防止order by之后行号乱套。
--oracle分页(rownum)
select *
from (select rownum r,e1.*
from (select * from emp order by sal) e1
where rownum <=8
)
where r >=5; --rownum不能使用>、>=。 嵌套子查询,为内层子查询的rownum取一个别名r,对r使用>、>=。
--内层子查询为了改变表固定的默认行号。外层子查询是为了解决>、>=的问题。
--临时表
create global temporary table xxx; --手动创建临时表 (排序会自动创建一个临时表。rownum会产生临时表,所以行号是固定的)
临时表特点:当事务或者会话结束的时候,表中的数据自动删除
--相关子查询: 将主查询中的值 作为参数传递给子查询
select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal
from emp e
where sal > (select avg(sal) from emp where deptno=e.deptno); --相关子查询
--行转列 wm_concat(varchar2) 多行函数
select deptno,wm_concat(ename) 别名
from emp
group by deptno; --把部门号相同的所有的记录的ename值拼成字符串