Oracle12C--伪列(十七)

这是啥?

    Oracle 数据库为了实现完整的关系数据库功能,自动帮助用户创建了许多伪列;
      除了默认伪列 nextval cu rrval ;还有两个重要伪列 rownum,rowid;
        dual 属于伪表 ;

        ROWID伪列

          数据表保存的每一行记录, Oracle 都会默认为每条记录分配一个唯一的地址编号,改编号是通过 rowid 表示的;所有的数据都利用它进行定位;
            ROWID 可以定位一个数据中的任何数据行。因为一个段只能存放在一个表空间内,通过使用数据对象号, Oracle 就可以找到包含数据行的表空间;之后使用表空间中的相对文件号就可以确定文件,再利用数据块号就可以确定包含所需数据行的数据块,最后使用行号就可以定位数据行的行目录项;
              示例:观察ROWID的存在
              SELECT ROWID,deptno,dname,loc FROM dept ;
              


              ROWNUM伪列

                此伪列表示的是一个数据行编号的伪列,它的内容是在用户查询数据的时候,为用户动态分配一个数字(行号);
                  示例:通过 rownum 查看行号
                  SELECT ROWNUM,empno,ename,job,sal,hiredate FROM emp ;
                  

                  效果:每条数据前都加上了一个行号,可以发现,这些行号是顺序排列的


                    常用操作:
                      操作 1 :取出一个查询的第一行记录;
                        操作 2 :取出一个查询的前 N 行记录;

                          举个栗子:
                            示例 1 :查询emp表中的第一行雇员信息
                              注意:第一种操作
                              SELECT * FROM emp WHERE ROWNUM=1 ;
                              

                              示例 2 :取出一个查询的前 N 行记录,这种操作常用于分页;
                                分页操作实际上由两个部分组成:
                                  数据显示部分:主要是从数据表中选出指定的部分数据,需要 ROWNUM 伪列才可以完成;
                                    分页控制部分:留给用户的控制端,用户只需要选择指定的页数,应用程序就会根据用户的选择,列出指定的部分数据;
                                      语法:
                                      select * from (    select 列1[,列2,....], ROWNUM rownum 别名
                                          from 表名称 [别名]
                                          where rownum <=(currentPage (当前所在页) * lineSize (每页显示记录行数))
                                      ) temp 
                                      where temp.rownum 别名>(currentPage (当前所在页) -1) * lineSize(每页显示记录行数);
                                      

                                      如果要实现前N行查询,就一定需要依靠子查询,此语法的作用原理如下图:

                                      通过上图,如果想显示 6~10 条记录,首先要通过子查询查询出前 10 条记录,之后再使用子查询中生成的 ROWNUM 行号通过外部的查询筛选出后 5
                                      举个栗子:显示雇员表中前5条记录
                                      SELECT * FROM (
                                      	SELECT empno,ename,job,hiredate,sal,mgr,deptno,ROWNUM rn 
                                      	FROM emp WHERE ROWNUM<=5) temp
                                      WHERE temp.rn>0 ;
                                      

                                        注意:上例的简便写法:此写法得到的值与上例一致,但这种写法是无法进行分页的扩展的;所以不推荐
                                        SELECT empno,ename,job,hiredate,sal,ROWNUM rn 
                                        FROM emp WHERE ROWNUM<=5
                                        

                                        再举个栗子:显示雇员表中的6~10条记录

                                        SELECT * FROM (
                                        	SELECT empno,ename,job,hiredate,sal,mgr,deptno,ROWNUM rn 
                                        	FROM emp WHERE ROWNUM<=10) temp
                                        WHERE temp.rn>5 ;
                                        



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

                                                请填写红包祝福语或标题

                                                红包个数最小为10个

                                                红包金额最低5元

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

                                                抵扣说明:

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

                                                余额充值