Oracle数据库rownum和row_number的不同点

Oracle数据库rownum和row_number的不同点

在Oracle数据库中,我们常常会用到rownumrow_number这两个关键字来操作行数据。它们虽然都可以用来对查询结果的行数进行限制,但它们有着不同的用法和功效。本文将详细讲解这两个关键字的区别,并结合实例进行说明。

rownum

rownum是Oracle数据库中内置的一个伪列,它在查询结果返回之后才会计算。rownum可以用来计算查询结果集中每一行的行号,但不能在where字句中使用和修改,因为它是在计算结果后才产生的。一般情况下,rownum的使用如下:

select * from table where rownum <= 10;

此语句的作用是查询table表中前10行数据。

示例1

我们假设有一个表employee,其中包含员工信息,例如姓名、年龄、性别等:

id name age gender
1 Alice 25 Female
2 Bob 28 Male
3 Chris 30 Male
4 David 35 Male
5 Emily 23 Female
6 Frank 31 Male
7 Grace 27 Female
8 Helen 29 Female
9 Ida 24 Female
10 Jack 33 Male
11 Kevin 26 Male
12 Lucy 32 Female
13 Mary 28 Female
14 Nancy 25 Female
15 Olivia 29 Female
16 Peter 30 Male
17 Queenie 27 Female
18 Rose 31 Female
19 Steve 28 Male
20 Tom 32 Male

我们希望查询employee表中前5条年龄最小的员工信息,可以使用如下查询语句:

select * from (
  select * from employee order by age
) where rownum <= 5;

这个查询语句中,先通过子查询将employee表按年龄从小到大排序,然后再对查询结果使用rownum进行限制,只返回前5行。

结果如下:

id name age gender
5 Emily 23 Female
9 Ida 24 Female
1 Alice 25 Female
14 Nancy 25 Female
7 Grace 27 Female

示例2

我们继续使用上面的employee表,假设现在有一个需求:查询年龄在25岁以上的前5个员工信息。如果直接使用rownum限制行数,会得到以下结果:

select * from employee where age >= 25 and rownum <= 5;

结果:

id name age gender
1 Alice 25 Female

我们发现这个查询语句只返回了一行记录,不符合我们的要求。这是因为查询条件age >= 25rownum <= 5在执行查询时是同时进行的,Oracle数据库返回了满足条件的第一行即结束。为了避免这种情况的发生,我们可以使用以下方式:

select * from (
  select * from employee where age >= 25 order by age
) where rownum <= 5;

在这个查询语句中,我们先对年龄大于等于25岁的员工进行筛选,然后按年龄从小到大排序,最后对结果使用rownum进行限制。这样就可以得到正确的结果了。

row_number

row_number是Oracle数据库中窗口函数中的一种,它可以用来计算查询结果集中每一行的行号。与rownum不同的是,row_number是在查询结果返回之前产生的,因此可以进行更为灵活的操作。一般情况下,row_number的使用如下:

select row_number() over (order by column_name) as row_num, *
from table;

此语句的作用是为查询结果集中的每一行添加一个序列号row_num,使其按指定列名进行排序。

示例1

我们仍然使用上面的employee表作为例子,现在需求变成了查询年龄在25岁以上的前5个员工信息,但是我们需要同时显示它们在所有员工中的排名。

select row_number() over (order by age) as row_num, e.*
from employee e
where age >= 25 and rownum <= 5;

这个查询语句中使用了row_number函数,并使用age来进行排序,同时仍然对结果集进行rownum限制。得到的结果如下:

row_num id name age gender
1 1 Alice 25 Female
2 14 Nancy 25 Female
3 7 Grace 27 Female
4 18 Rose 31 Female
5 12 Lucy 32 Female

我们可以看到,查询结果中不仅包含了员工信息,还将查询结果集中的每一行按年龄从小到大排序,并添加了一个序列号row_num,使得我们可以轻松得到每个员工在所有员工中的排名。

示例2

假设我们现在有一个需求:查询男性员工信息,并按年龄从小到大排序,在每个年龄段内按工资从高到低排序,最后给工资最高的男性员工输出"赚钱特别多"。我们可以使用如下SQL语句:

select 
  id, name, age, salary,
  rank() over (partition by age order by salary desc) as salary_rank
from employee
where gender = 'Male'
order by age, salary desc;

这个查询语句在查询结果中使用rank()函数,对员工按年龄分组,然后按工资从高到低进行排序,并添加一个salary_rank列,用来表示该员工在同龄男性员工中的收入排名。最后还对查询结果按年龄从小到大,再按工资从高到低进行排序。

为了输出"赚钱特别多"的男性员工,我们还需要在以上SQL语句的基础上进行扩展,可以看下面的SQL语句:

with male_salary_rank as (
  select 
    id, name, age, salary, 
    rank() over (partition by age order by salary desc) as salary_rank
  from employee
  where gender = 'Male'
)
select 
  id, name, age, salary, 
  case
    when age in (25, 30) and salary_rank = 1 then '赚钱特别多'
    else ''
  end as comment
from male_salary_rank
order by age, salary desc;

这个SQL语句先使用公共表达式将查询结果存放到male_salary_rank中,然后对male_salary_rank中的内容进行加工,使用case语句对年龄为25岁和30岁的员工进行特别处理,输出"赚钱特别多"的信息。最后再将结果按年龄从小到大,再按工资从高到低进行排序。

总结

rownumrow_number都可以用来计算查询结果集中每一行的行号,但它们有着不同的用法和功效。rownum是Oracle数据库中内置的一个伪列,它在查询结果返回之后才会计算;row_number是Oracle数据库中窗口函数中的一种,它可以用来计算查询结果集中每一行的行号,同时可以进行更为灵活的操作。可以根据具体需求,灵活选择使用这两个关键字来操作行数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Oracle数据库rownum和row_number的不同点 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • 忘记MySQL的root密码该怎么办

    下面是详细的“忘记MySQL的root密码该怎么办”的攻略: 1. 通过安全模式重置密码的步骤 如果你忘记了MySQL的root密码,你可以尝试以下步骤来重置密码: 首先,关闭MySQL服务。在Linux系统中,可以使用以下命令: sudo service mysql stop 然后,在安全模式下启动MySQL服务。在Linux系统下,可以使用以下命令: s…

    database 2023年5月22日
    00
  • MySQL压测神器HammerDB的部署及使用详解

    MySQL压测神器HammerDB的部署及使用详解 概述 HammerDB是一款可用于MySQL压力测试的免费开源工具。本攻略将详细介绍如何部署和使用HammerDB。 部署 下载并安装HammerDB 下载地址:http://www.hammerdb.com/download.html 安装MySQL服务器 如果您没有MySQL服务器,您需要在测试机上安装…

    database 2023年5月22日
    00
  • SQL LOADER错误小结

    SQL LOADER是一个用于将数据从纯文本文件加载到ORACLE数据库中的工具,但是在实际使用中难免会遇到一些错误,本攻略旨在帮助大家更好地掌握SQL LOADER程序中的错误类型及解决方法。 SQL LOADER常见错误类型 1. 数据输入文件格式错误 这种错误通常是由于输入文件在编写时格式不规范,如某一行结束符缺失或者格式不统一等。在SQL LOADE…

    database 2023年5月18日
    00
  • Mysql系列SQL查询语句书写顺序及执行顺序详解

    关于”Mysql系列SQL查询语句书写顺序及执行顺序详解”的攻略,我们可以从以下几个方面进行介绍。 常见的查询语句书写顺序 为了方便理解,在学习查询语句的过程中,我们一般会按照以下的顺序来书写我们的查询语句: 选择需要查询的列,使用select关键字。 确定查询的表名或视图名,使用from关键字,并指定查询表或视图的名称。 指定额外的条件,使用where关键…

    database 2023年5月21日
    00
  • Linux中redis服务开启docker运行redis并设置密码

    //查询目前可用的reids镜像 docker search redis //选择拉取官网的镜像 docker pull redis //查看本地是否有redis镜像 docker images //运行redis并设置密码 docker run -d –name myredis -p 6379:6379 redis –requirepass “mypa…

    Redis 2023年4月13日
    00
  • 解决ORA-12170:TNS connect timeout occurred问题

    解决ORACLE数据库连接时出现“ORA-12170:TNS connect timeout occurred”问题的方法如下: 问题分析 此问题通常是由于连接超时或者网络故障所引起。解决方法如下: 解决方案 确认环境配置 首先需要核实环境的配置是否正确。比如确认防火墙是否阻止了连接,确认listener是否启动,以及确认网络是否正常等。 在Linux系统中…

    database 2023年5月18日
    00
  • 数据库中主键和外键的区别

    数据库中主键和外键是两个非常重要的概念。 主键 主键是一列或一组列,用于唯一标识表中每个记录。主键的值必须是唯一的,并且不能为NULL。在一个数据库表中,只能有一个主键。 在设计数据库时,主键往往是一个自增的整形数,这样可以保证每个记录都有一个不同的主键值,方便进行操作和查询。例如: CREATE TABLE Users ( Id INT AUTO_INCR…

    database 2023年3月27日
    00
  • MySql按时,天,周,月进行数据统计

    要对 MySql 数据库中的数据进行按时、天、周、月等维度的统计,一般需要借助 SQL 语言中的 GROUP BY 和 DATE 函数来实现。 下面是具体步骤: 1. 确认需求 首先需要明确需要进行的数据统计需求,包括统计哪些指标、按照哪些维度、需要的时间范围等,从而可以明确 SQL 语句的核心逻辑。 2. 选择统计的数据表 根据需求选择需要进行统计的数据表…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部