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伪列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mssql查找备注(text,ntext)类型字段为空的方法

    mssql查找备注(text,ntext)类型字段为空的方法

    在sql语句中,如果查找某个文本字段值为空的,可以用select * from 表 where 字段='' ,但是如果这个字段数据类型是text或者ntext,那上面的sql语句就要出错了。
    2008-08-08
  • 编程经验点滴 动态SQL的拼接技巧

    编程经验点滴 动态SQL的拼接技巧

    众多人在回复,其中至少有三位老兄,误解了动态 SQL 的拼接。特写此文,阐述一下其中的技巧。希望能纠正初学者的错误
    2012-09-09
  • SQL Server定时收缩数据库日志为指定大小的示例代码

    SQL Server定时收缩数据库日志为指定大小的示例代码

    SQL Server提供了DBCC SHRINKFILE 命令来清理事务日志文件,该命令可以缩小指定文件的大小,并释放磁盘空间,本文给大家介绍了SQL Server如何定时收缩数据库日志为指定大小,需要的朋友可以参考下
    2024-03-03
  • hive中将string数据转为bigint的操作

    hive中将string数据转为bigint的操作

    这篇文章主要介绍了hive中将string数据转为bigint的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SqlServer数据库提示 “tempdb” 的日志已满 问题解决方案

    SqlServer数据库提示 “tempdb” 的日志已满 问题解决方案

    本文主要讲述了笔者在执行sql语句的过程中,遇到提示“数据库 'tempdb' 的日志已满。请备份该数据库的事务日志以释放一些日志空间。”的解决过程,希望对大家有所帮助
    2014-08-08
  • SQL Server中数据类型转换的原理、使用方法、常见场景示例讲解

    SQL Server中数据类型转换的原理、使用方法、常见场景示例讲解

    在SQLServer中,数据类型转换包含隐式转换和显式转换两种方式,隐式转换由系统自动完成,而显式转换需要使用CAST或CONVERT函数,本文详细讲解了数据类型转换的原理、使用方法和常见场景,并提供了具体示例,同时,介绍了错误处理函数TRY_CAST和TRY_CONVERT
    2024-09-09
  • SQL Server 常用函数使用方法小结

    SQL Server 常用函数使用方法小结

    这篇文章主要介绍了SQL Server 常用函数使用方法小结,需要的朋友可以参考下
    2017-05-05
  • sql调优的几种方式小结

    sql调优的几种方式小结

    本文主要介绍了sql调优的几种方式小结,包含了15种调优方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • sqlserver 手工实现差异备份的步骤

    sqlserver 手工实现差异备份的步骤

    sqlserver 手工实现差异备份的步骤,需要的朋友可以参考下。
    2011-04-04
  • mysql 数据库中索引原理分析说明

    mysql 数据库中索引原理分析说明

    实际上,您可以把索引理解为一种特殊的目录。微软的SQLSERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。
    2010-03-03

最新评论