Oracle数据库——两个重要的数据伪列-12


两个重要的数据伪列(重点)

在之前使用过的SYSDATE,这个列虽然没有在表中定义,但是却可以使用,除了这个,还有两个非常重要的伪列
:ROWNUM,ROWID


行号:ROWNUM

ROWNUM是一个在查询之中可以根据数据行自动生成的一个行标记伪列


范例:观察ROWNUM使用
SELECT ROWNUM ,empno,ename,job,deptno,sal FROM emp;

ROWNUM这个列原本就不在emp表之中,但是由于其是伪列,所以可以直接查询,执行之后发现随着数据行的累加,ROWNUM可以自动的进行
行号的累加,但是必须强调的是ROWNUM并不是固定的,是在动态生成的,而Oracle之中使用ROWNUM可以实现两个功能:
功能一:取得第一行记录
功能二:取得前N行记录


范例:取得第一行记录
SELECT ROWNUM ,empno,ename,job,deptno,sal FROM emp WHERE ROWNUM=1 AND deptno=10;


范例二:取得前N行记录
SELECT ROWNUM ,empno,ename,job,deptno,sal FROM emp WHERE ROWNUM<10;
但是需要记住的是,ROWNUM本身并没有提供取得指定范围行的功能。
因为ROWNUM属于动态生成

范例:错误的应用
SELECT ROWNUM ,empno,ename,job,deptno,sal FROM emp WHERE ROWNUM BETWEEN 6 AND 10;

如果想取得正确指定范围行的记录,则必须使用子查询,例如:以上一例的要求,取得6到10行
先要取得前10行记录,而后再通过前10行取得里面的后五行记录
所以现在可以有如下的一个变量代入


SELECT * FROM(
SELECT ROWNUM rn,empno,ename,job,deptno,sal FROM emp WHERE

ROWNUM<=10) temp                            =<10=currentPage*lineSize
WHERE temp.rn>5;                                 =<5=(currentPage-1)*lineSize

范例:取得前5条
这个前时候有两种写法,一种就是直接取得5条(语法上没错,但不通用)
SELECT ROWNUM ,empno,ename,job,deptno,sal FROM emp WHERE ROWNUM<=5;
currentPage=1    lineSize=5
SELECT * FROM(
SELECT ROWNUM rn,empno,ename,job,deptno,sal FROM emp WHERE ROWNUM<=5) temp   
WHERE temp.rn>0;

SELECT * FROM(
SELECT ROWNUM rn,列,列,列...
FROM 表名称
WHERE ROWNUM.rn<(currentPage* lineSize) 
WHERE temp.rn>((currentPage-1)* lineSize);

行ID:ROWID(了解)
范例:观察ROWID
SELECT ROWID,deptno,dname,loc FROM dept;
发现这个时候每行数据的ROWID不同,它包含如下的几个组成部分
数据对象号:AAAR3q
相对文件号:AAE
数据块号:AAAACH
数据块号:AAA
范例:将dept复制为mydept
CREATE TABLE mydept AS SELECT * FROM dept;
由于数据库设计不严谨,加入重复的数据,使用DELETE语句删除,会把两行数据被删除
所以用ROWID来删除
此种方式是作为唯一的物理地址标识使用的。
面试题:现在的mydept表由于最早设计的问题,导致里面大量的重复数据

要求:通过一条语句删除所有重复数据,保留最早的数据
范例:编写语句
第一步,继续使用分组,统计出所有最早的ROWID(要保留的)
SELECT MIN(ROWID)
FROM mydept
GROUP BY deptno,dname,loc;
第二步:保留以上的ROWID
DELETE FROM mydept
WHERE ROWID NOT IN(
SELECT MIN(ROWID)
FROM mydept
GROUP BY deptno,dname,loc);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值