oracle 数据伪列 + 子查询(学习笔记)

ROWNUM,ROWID

行号:ROWNUM:(核心)
利用它进行自动的行号编号,(自动生成的行号,不是固定的)
eg: select rownum,ename,job from emp;  (rownum放前面后面都可以)
作用(rownum也只有这两个作用):
· 取出第一行记录:
  eg:  取出emp表的第一条记录
select * from emp where rownum=1;
· 取出前n行记录:
  eg:  取出emp表的前5条记录
select * from emp where rownum<=5;

查询m~n条记录:(rownum不支持between...and)
eg:查询emp表6到10条记录
第一步: 查询前10条记录: select empno,ename,job, rownum rn from emp where rownum<=10;
第二步: 第一步中返回了多行多列,此时rownum作为了一个列出现,可以使用where子句
SELECT * from (
select empno,ename,job, rownum rn 
from emp 
where rownum<=10) temp
where temp.rn>5;


实现数据分页的操作格式(开发中100%会使用):
select* from                                                   //(currentPage  指第几页)
(select 列,...,rownum rn
from 表名称,表名称,...
where rownum <=(currentPage*lineSize)
order by 字段,...) temp
where temp.rn>( (currentPage-1)*lineSize );




           ROWID:描述一行记录唯一的物理地址编号。利用ROWID能查到对应的记录。
例如:
SQL> select rowid,dname from dept;


ROWID              DNAME
------------------ ----------------------------
AAAR3qAAEAAAACHAAA ACCOUNTING
AAAR3qAAEAAAACHAAB RESEARCH
AAAR3qAAEAAAACHAAC SALES
AAAR3qAAEAAAACHAAD OPERATIONS


------------------------------------------------
数据的对象编号:AAAR3q
数据保存文件编号:AAE
数据保存的块号:AAAACH
数据保存的行号:AAA 

子查询:====================================

如果子查询返回的内容是单行多列的话:
eg:
查询与scott进行同一工作,并且工资相同的雇员信息:
select* from emp
where (job,sal) = (
select job,sal
from emp
where ename='SCOTT')
and ename<>'SCOTT';

如果子查询返回的内容是多行多列的话:就表示一个操作的数据范围了,有以下三个操作符:
· IN  操作:指的是与子查询返回的其中一个内容相同
·ANY操作:一共分为三种形式:
· =ANY:功能与IN操作一样
· >ANY:大于子查询返回的最小值
· <ANY:小于子查询返回的最大值
·ALL操作:一共分为2种新式:
· >ALL:大于子查询返回的最大值
· <ALL:小于子查询返回的最小值


FROM子句里面的子查询:
eg:
查询出每个部门的名称,位置,部门人数:
法一:多表查询:
select d.dname,d.loc,count(e.empno)
from emp e,dept d
where e.deptno(+)=d.deptno
group by d.dname,d.loc;
法二:from子句:
select d.dname,d.loc,temp.count
from dept d,(
select deptno,count(empno) count
from emp
group by deptno) temp
where d.deptno=temp.deptno(+);


如果是子查询,首先考虑的是where和from 里面出现子查询,而having里面出现子查询只有在统计函数的时候才会用










































你可能感兴趣的:(oracle)