数据伪列(重点)

数据伪列

伪列:不是自己创建的列,但是存在在每一个表中

在我们的oracle中,提供了很多伪列,例如:rownum(行号,与开发有关),rowid(与分析数据有关),sysdate(提供当前系统日期) ,systimestamp

首先,我们先了解一下rownum:
行号:rownum
作用:针对查询到的每一行记录,进行一个编号,不是固定的,自动生成
我们在数据查询的时候,默认情况下数据库会显示数据表中结构的内容。但是我们可以利用rownum对数据进行一个自动的行号编号

我们可以利用rownum处理以下操作:

取出第一条记录;

select * from emp where rownum = 1;
注意:此处rownum只能等于1,如果等于其他数字,则查询不到数据

我们在对一个数据表分析时,需要使用;
不要直接使用select* from表名,因为这样在数据非常多的情况下对造成数据库的卡死,不建议使用,这是最蠢的做法。

取出前n行记录;

select * from emp where rownum <= n;
注意:限定查询是根据数据库实际存在的列进行筛选查询的,如果将rownum用于限定查询,数据是查询不到的。
因为rownum是伪列,伪列不是自己创建的,是oracle规定的虚拟列。

那如果要取出第6-10行数据呢?
第一步,先取出前10行记录(需要注意的是,如果是取出所有列,就不能用*代替了,需要把所有列列出来,并且rownum也要列出来,并用别名代替,这样返回了前10条多行多列的数据,并且用别名代替的rownum也变成了实际列存在,这个时候将查询到的结果运用子查询放到from后面,然后运用限定查询查询出来)

select caozydm,caozyxm,mim,qiy,pinym,rownum rn  from caozyxx where rownum <=10

第二步,将第一步查询到的数据作为子查询放到from后面,利用限定查询查询出第6-10行(如果一共9行数据的话,那么他会将剩余的全部显示出来,并不会报错)

select *
from  (select caozydm,caozyxm,mim,qiy,pinym,rownum rn  
			from caozyxx 
			where rownum <=10) temp
where temp.rn >5;

这也就是数据库中实现分页的核心结构:
根据上面的例子,取出第6-10行数据,也就是在第二页(currentpage = 2),取出5行数据,相当于每页显示5行(linesize = 5)

select * 
from  (
		select 列….,rownum rn 
		from 表1,表2….
		where rn<=(currentpage(当前页数)*linesize(一页显示的数量))
		order by  …..
) temp
where 
temp.rn >((currentpage(当前页数)-1)*linesize(一页显示的数量))

即,第一步先取出小于这一页最大数据的所有数据,
第二步在取出小于这一页最小的数据,中间的数据便是本页中的数据
在这里插入图片描述

**

行ID rowid

在进行表中数据保存的时候,除了用户可以见到的数据列之外,那么所有表中的数据行都会有一个唯一的一块物理地址编号,就算表中的所有数据都一样,但是每一行的物理编号一定是唯一的,这种编号就可以用rowid找到,rowid的最大作用是描述一行记录的唯一编号

例:select rowid ,caozydm,caozyxm,mim,qiy,pinym from caozyxx
在这里插入图片描述

以AAAiitAAJAABYwzAAA为例:
组成:数据的对象编号:AAAiit —相当于告诉你图书馆在哪
数据保存文件编号:AAJ ----告诉你书在哪个柜子上
数据保存的块号:AABYwz ----告诉你书在柜子上的哪个书架上
数据保存的行号:AAA ----告诉你书架上书的顺序在第几本
任何情况下,都可以通过rowid能找到一条数据
select* from caozyxx where rowid = ‘AAAiitAAJAABYwzAAA’

整一道题,利于理解:
删除掉重复数据,只剩一条rowid最小的数据
原表:在这里插入图片描述
首先第一步:我们需要先求出每一种不同数据中rowid最小的数据
//分组分组就是将分组列中数据相同的分为一组,min 函数再将每一组中rowid最小的显示出来,不用在意,我在自言自语,加强我自己的理解

    select caozydm,caozyxm,mim,qiy,pinym, min(rowid)
    from mycaozy 
    group by caozydm,caozyxm ,mim,qiy,pinym

在这里插入图片描述

**第二步:**既然我们求出了每种不同数据中rowid最小的数据,那剩余的数据就是重复的,我们可以利用rowid的不重复性将不是最小rowid的数据删除掉

delete from mycaozy 
where rowid not in (select min(rowid)
								from mycaozy 
								group by caozydm,caozyxm ,mim,qiy,pinym)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/enbaoIT/article/details/87954789
今日推荐