Oracle常用两个伪列(ROWNUM和ROWID)的学习使用。

伪列只能查询,不能进行增删改操作。

Oracle中的伪列(pseudocolumn)是一种虚拟的列,它并不存在于表中,但可以像表的实际列一样在查询中使用。伪列通常提供与表行相关的信息,或者为用户提供有用的功能。

常见用法
    •    计算: 可以结合伪列和表列进行计算。
    •    过滤: 结合 ROWNUM 限制结果集的行数。
    •    分层查询: 使用 LEVEL 构造层次结构。

伪列特点:
    •    伪列不占用存储空间。
    •    
伪列只能查询,不能进行增删改操作。

1. ROWNUM每一行的行号

!!!注意:ROWNUM的生成时间:扫描结果之后,结果排序之前

!!!注意:ROWNUM后的运算符只能是<或者<=

因为rownum是在逐行扫描出结果之后分配的,也就是说必须先扫描到结果才能为其分配行号。

•    注意:ROWNUM 的分配是基于查询结果的生成顺序。

•    用于为查询结果集的每一行分配一个唯一的行号,从 1 开始。 


示例1:注意:ROWNUM后的运算符只能是<或者<=
SELECT ROWNUM, column_name FROM table_name WHERE ROWNUM <= 10;

示例2:注意:ROWNUM后的运算符只能是<或者<=
SELECT ROWNUM, column_name FROM table_name WHERE ROWNUM > 10;
--运行错误:注意:ROWNUM后的运算符只能是<或者<= 
--因为rownum是在逐行扫描出结果之后分配的,也就是说必须先扫描到结果才能为其分配行号。

示例3:解决示例2的问题
select  *  from  (SELECT ROWNUM R,t.* FROM table_name t) where r > 10; 
--先运算子查询,产生R值作为普通列,所以外层查询才可以利用>符号

***Oracle实现分页:
示例4:实现分页查询
rownum结合order by 使用规则:
★第一层子查询先做order by
★第二层子查询带出rownum 
★第三层查询再来选择排序后要显示的行号结果

select * from 
(select rownum r,t.* from 
(select * from z_detail order by lrrq desc) --第一层子查询先做order by
t) --第二层子查询带出rownum
where r>10 and r<=20;--第三层查询再来选择排序后要显示的行号结果


***MySQL特有分页参数limit:限制。
★语法:limit 起始索引,查询记录数;
★起始索引=(页码-1)*每一页展示的记录数
实例1:第一页,每页10条
SELECT * FROM emp limit 0,10;
起始索引0=(1-1)*10

实例2:查询第二页员工数据,每页展示10条。
SELECT * FROM emp limit 10,10;
起始索引10=(2-1)*10

以此类推:
第三页
SELECT * FROM emp limit 20,10;
第四页
SELECT * FROM emp limit 30,10;

2. ROWID每一行的物理存储位置

点此学习:为什么Oracle数据库在修改数据时需要使用到伪列ROWID?性能优化+避免锁表+精确定位记录等。icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_45806267/article/details/144385571?spm=1001.2014.3001.5501

由于ROWID的特性,所以Oracle建表可以不建主键,因为ROWID就是每一行的唯一标识。并且rowid直接定位到物理地址,所以利用它查询效率也更快。

    •    表示 Oracle 数据库中每一行的唯一地址(每一行数据的物理存储位置)。
    •    用于快速定位行。

示例:SELECT ROWID,column_name FROM table_name;

你可能感兴趣的:(server+SQL,oracle,学习,数据库)