之前接触过SYSDATE伪列。所谓的伪列就是指列本身不存在,但是却可以进行使用的列。Oracle里面提供有两个非常重要的伪列:ROWNUM(比较重要)、ROWID。
1、行号(ROWNUM)
如果在开发之中使用了ROWNUM,那么就表示会自动地生成行号。
发现ROWNUN在每一行显示的时候都会自动增加一个行号,但是ROWNUM生成的行号不是固定的,而是动态计算得来的。
此时行号是根据查询结果动态计算出来的,所以每一个行号都不会与特定的记录捆绑。
解释:为什么NOT IN 里面不能够有NULL。
NOT IN(NULL) 如果某一列上的内容就没有null,那么就表示查询全部,但是NOT IN本身的作用是进行数据的部分筛选,结果由于自身的数据错误导致查询全部,那么就是灾难了。
一般而言有经验的工程师都不会进行“SELECT * FROM 表”,都会做一个限定查询,例如:查询第一行,此时就可以使用ROWNUM来完成。例如:SELECT * FROM EMP WHERE ROWNUM=1
对ROWNUM而言最为重要的特性是在于它可以取得前n行记录。
在数据表的查询过程之中,ROWNUM不能够定义范围,所以此时要想正确实现所需要的功能,就必须利用子查询完成。在子查询中首先查询前10行记录,而后在查询后5行记录。(前10行记录当做一张表的话,里面的ROWNUM值就固定了)所以可以用下面的方式查:
程序中分页功能的实现就利用了以上的查询语句。
对分页而言,往往都有一个属于自己的固定语法形式,下面给出参考格式:
·currentpage:表示的是当前所在页
·pagesize:表示每页显示的数据行
select * from
(select rownum rn,empno,ename,job from myemp
where rownum<=currentsize*pagesize)temp
where temp.rn>(currentpage-1)*pagesize;
2、行ID:ROWID
ROWID大部分情况下是针对于一些分析上使用的,而且在实际的开发过程之中,几乎也不会感受到ROWID的存在。所谓的ROWID指的是针对于每行数据提供的物理地址。
范例:查看ROWID:
范例:如下mydept表中有完全重复的数据
现在的问题是表中的数据列的信息几乎都是一样的,所以如果按照已有的字段删除,那么最终的结果都会被删除掉。那么现在即便数据重复了,那么在Oracle里面存在有一个ROWID,它的物理保存地址也是不可能重复的。
在程序之中都会设计累加的操作,所以理论上来讲,最早保存数据的ROWID应该是最小的。所有会使用到min()函数
使用如下代码来完成: