Sql奇技淫巧之ROWNUM伪列的使用

 更新时间:2023年08月15日 08:14:32   作者:Echoo华地  
本文主要介绍了Sql奇技淫巧之ROWNUM伪列,ROWNUM是一个伪列,它是根据每次查询的结果动态生成的一列递增编号,下面就一起来介绍一下如何使用把

ROWNUM伪列

ROWNUM是一个伪列,它是根据每次查询的结果动态生成的一列递增编号,表示 Oracle 从表中选择该行的顺序,选择的第一行ROWNUM为1,第二行ROWNUM为2,以此类推。

注意1:

ROWNUM伪列是在WHERE子句之前生成的,就是说它并不是在执行了WHERE子句过滤之后再对数据编号
比如在执行WHERE子句,结果数据是这样的:

idnameageROWNUM
0001mary181
0002mike202
0003john193
0004kitty164
0005susy185
0006echoo216

这时候的ROWNUM是一列递增排列的、完整的编号
然后如果执行一个WHERE子句:WHERE age >18那数据就变成了:

idnameageROWNUM
0002mike202
0003john193
0004kitty216

ROWNUM出现了断层,不连续了
如果后面再执行一个ORDER BY age DESC就变成这样了:

idnameageROWNUM
0004kitty216
0002mike202
0003john193

ROWNUM不按顺序排了
所以在利用ROWNUM伪列来对结果集做限制、过滤、排序、分页等操作的时候一定要注意这个点,不然很容易错乱;

注意2:

ROWNUM是一行一行赋值的,只有上一行数据被选择成功,下一行才会递增!而且 select 语句也是一行一行选择的,每 select 一行数据就要进行 where 条件判断。
比如有这样一个employees表:

idnameage
0001mary18
0002mike20
0003john19
0004kitty16
0005susy18
0006echoo21

对这个表执行这样一个SQL:

SELECT * FROM employees WHERE ROWNUM > 1;

这句SQL的预期为取出除第一条数据外的所有数据,但是执行的结果是一条都选不出来,来看执行过程:

① select 出的第一条数据为

idnameage
0001mary18

② ROWNUM 给这条数据赋值,因为是第一条数据,所以从 1 开始,赋值完是这样的:

idnameageROWNUM
0001mary181

③ 进行 WHERE ROWNUM > 1 条件判断,1>1不满足条件,所以第一条数据被过滤掉
④ select 第二条数据

idnameage
0002mike20

⑤ ROWNUM 给这条数据赋值,因为上一条数据被过滤掉了,所以还是从 1 开始,赋值完是这样的:

idnameageROWNUM
0002mike201

⑥ 进行 WHERE ROWNUM > 1 条件判断,1>1不满足条件,所以这数据也被过滤掉
⑦ ·············
一直如此循环直到结束,都没有符合条件的数据,所以一条数据都选不出来!

例1:取前10条数据

ROWNUM来限制查询返回的行数,如下例所示:

SELECT * FROM employees WHERE ROWNUM < 11;

WHERE ROWNUM < 11表示返回查询数据的前10条;

例2:取排序后的前10条数据

不能够像下面这样直接在WHERE子句后简单的加上ORDER BY子句了

SELECT * FROM employees WHERE ROWNUM < 11 ORDER BY age;

因为这里的意思是先执行WHERE子句选出ROWNUM1~10的数据,然后再进行排列,和我们预想不符。我们要的是按年龄排序后的前10条数据。
所以应该这样写:

SELECT *
  FROM (SELECT * FROM employees ORDER BY employee_id)
  WHERE ROWNUM < 11;

这里的意思就是先执行排序,然后对排完序的结果集用ROWNUM伪列按顺序编号,然后取其中ROWNUM为1~10的那10条数据;

例3:分页

SELECT * 
FROM( SELECT temp_table.*,ROWNUM AS rn
  	  FROM (SELECT * FROM employees ORDER BY employee_id) temp_table
  	 ) result_table
WHERE result_table.rn BETWEEN 起始行数 AND 结尾行数

通过嵌套查询的方式,把动态的ROWNUM伪列变成固定的列rn,然后再用rn列进行分页;

到此这篇关于Sql奇技淫巧之ROWNUM伪列的文章就介绍到这了,更多相关Sql奇技淫巧之ROWNUM伪列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Sql Server中的事务介绍

    Sql Server中的事务介绍

    这篇文章主要介绍了Sql Server中的事务介绍,本文讲解了什么是事务、事务的分类、事务的语句、事务的4个特性、事务实例等内容,需要的朋友可以参考下
    2015-01-01
  • MS SQL Server STUFF实现统计记录行转为列显示

    MS SQL Server STUFF实现统计记录行转为列显示

    SQL语句行转列函数是一种用于将多个行数据转换为一列的函数,本文主要介绍了MS SQL Server STUFF实现统计记录行转为列显示,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期

    sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期

    CTE是在内存中准备好数据,而不是每次一条往返服务器和客户端一次。如果需要再插入到临时表的话就是全部数据一次性插入。 这篇文章主要介绍了sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期 ,需要的朋友可以参考下
    2019-07-07
  • Sql中存储过程的定义、修改和删除操作

    Sql中存储过程的定义、修改和删除操作

    这篇文章主要介绍了Sql中存储过程的定义、修改和删除的相关资料,需要的朋友可以参考下
    2017-10-10
  • SQLSERVER 临时表和表变量的区别汇总

    SQLSERVER 临时表和表变量的区别汇总

    不管临时表还是表变量都带了表这个词,既然提到表 ,按推理自然会落到某数据库中,如果真在一个数据库中,那自然就有它的存储文件 .mdf和.ldf,那是不是如我推理的那样呢,这篇文章主要介绍了SQLSERVER 临时表和表变量到底有什么区别,需要的朋友可以参考下
    2023-02-02
  • sql server中随机函数NewID()和Rand()

    sql server中随机函数NewID()和Rand()

    在SQL语言中,随机函数NEWID和rand()用法并不相同,下面就将为您示例分析这两个随机函数的区别,供您参考,希望对您深入理解SQL函数能起到作用
    2015-10-10
  • SQL SERVER数据库中日期格式化详解

    SQL SERVER数据库中日期格式化详解

    这篇文章主要给大家介绍了关于SQL SERVER数据库中日期格式化的相关资料,在SQL Server中可以使用CONVERT函数来格式化日期,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • sql server服务无法启动的解决方案

    sql server服务无法启动的解决方案

    sql server软件是一款关系型数据库管理系统,具有使用方便可伸缩性好与相关软件集成程度高等优点,我们在数据编程操作时经常会使用这款编程软件,在编程时系统有时会提示sql server服务无法启动,那么大家该如何正常启动呢,下面就由小编来给大家介绍一下如何解决
    2023-11-11
  • sql语句优化之SQL Server(详细整理)

    sql语句优化之SQL Server(详细整理)

    这篇文章主要介绍了sql语句优化之SQL Server篇,整理的比较详细,推荐收藏
    2014-07-07
  • Sql Server 压缩数据库日志文件的方法

    Sql Server 压缩数据库日志文件的方法

    Sql Server 日志 _log.ldf文件太大,数据库文件有500g,日志文件也达到了500g,占用磁盘空间过大,且可能影响程序性能,需要压缩日志文件,下面小编给大家讲解下Sql Server 压缩数据库日志文件的方法,感兴趣的朋友一起看看吧
    2022-11-11

最新评论