`
xu520
  • 浏览: 81712 次
  • 性别: Icon_minigender_1
  • 来自: 金华
社区版块
存档分类
最新评论

如何在Oracle中实现SELECT TOP N,选取前几条记录

 
阅读更多

由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM和子查询的组合来实现SELECT TOP N的查询。

rownum:

对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。

<wbr></wbr>

example: select rownum as 行号,first_name as 员工姓名 from hr.employees

select rownum as 行号,first_name as 员工姓名 from hr.employees
<wbr>order by 员工姓名;</wbr>

<wbr></wbr>



序号不会重新排的,(所以需要嵌套一层子查询来抽取排序好的数据)原因下面解释。

<wbr></wbr>

例1:查询各个部门的MANAGER(经理)中谁的工资最低<wbr><wbr><span></span>hr</wbr></wbr>

select * from
(
select t1.manager_id as 员工编号,t2.first_name as 员工姓名,t2.salary as 工资
from hr.departments t1
join hr.employees t2 on t1.manager_id=t2.employee_id
order by t2.salary

)
where rownum=1;
*******************************************************************************

where rownum=1;表示取第一行,<wbr><span style="font-family:宋体; color:#0c0c0c; line-height:21px; word-wrap:normal; word-break:normal"><strong style="font-weight:bold">rownum&lt;=1也是;但</strong><span style="font-family:Arial; color:#000000; line-height:21px; word-wrap:normal; word-break:normal"><wbr></wbr></span><span style="font-family:宋体; color:#0c0c0c; line-height:21px; word-wrap:normal; word-break:normal"><strong style="font-weight:bold">rownum=2、&gt;2、=2什么的是不行的</strong></span></span></wbr>

只能用<=、<、=1,而且排序好后得用一个子查询

原因:

1.因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。

查到就加上了,所以排序就是原先的rownum值了。

2.rownum j就是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。

3.他是不存在的,只有在每次select后才会重新分配,所以加个子查询重新分配rownum

*******************************************************************************

例2:查询工资最高的5个人的信息,按工资降序排列:hr

select * from

(

select t2.department_name as 部门名称,

t1.first_name as 员工姓名,t1.salary as 工资

from employees t1

left outer join departments t2 on t2.department_id=t1.department_id

order by t1.salary desc

)

where rownum<=5

*******************************************************************************

<wbr></wbr>

但是如果想要提取出第m行的数据或者中间几条数据该怎么办?rownum=m是不行的

这里可以再用嵌套的子查询

例3:查询工资从高到低排名第2-5个人的信息<wbr><wbr>hr.</wbr></wbr>

<wbr></wbr>select 部门名称,员工姓名,工资 from<wbr><wbr></wbr></wbr>--第一层
<wbr><span></span>(<br><wbr><wbr><wbr><wbr><span></span>select rownum as no,部门名称,员工姓名,工资 from<wbr><span></span>--第二层,这里的rownum得有别名,不然外层和其本身的重名<br><wbr><wbr><wbr><wbr><span></span>(<br><wbr><wbr><wbr><span></span><wbr>select t2.department_name as 部门名称,</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
-- 第三层
<wbr><wbr><wbr><wbr><span></span>t1.first_name as 员工姓名,t1.salary as 工资<br><wbr><wbr><wbr><span></span><wbr>from employees t1<br><wbr><wbr><span></span><wbr><span></span>left outer join departments t2 on t2.department_id=t1.department_id<br><wbr><wbr><span></span><wbr><span></span>order by t1.salary desc<br><wbr><span></span><wbr><wbr><span></span>)<br><wbr><span></span>where rownum&lt;=5</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
--取出前五行
<wbr><span></span>)<br> where no&gt;=2 and no&lt;=5<span></span><span style="color:#ff0000; line-height:21px; word-wrap:normal; word-break:normal">-- 取出2-5编号</span></wbr>

<wbr></wbr>

<wbr></wbr>

例4:抽出按某种方式排序的记录集中的第M条记录开始的X条记录

和上面的差不多,第三层rownum<=N<wbr><wbr><span></span>这里的N必须满足N &gt;= (M + X - 1)</wbr></wbr>

最外的条件改为 no bwtween M and (m+x-1)就可以了

分享到:
评论

相关推荐

    Oracle结合Mybatis实现取表TOP 10条数据

    总结起来,Oracle结合Mybatis实现取表TOP 10条数据的关键在于理解并正确使用`ROWNUM`,以及在Mybatis中适当地处理查询条件和序列值。通过子查询和设置Mybatis的缓存属性,我们可以有效地解决这些问题,从而在Oracle...

    各个数据库分页技术关键代码

    在这个例子中,`M`表示从第几条记录开始,`N`表示要取多少条记录。例如,如果我们想从`Sys_option`表中从第10条记录开始获取20条记录,可以写成: ```sql SELECT * FROM ( SELECT TOP 20 * FROM ( SELECT TOP ...

    不同数据库中分页的代码实现

    - `@StartPos`: 表示从第几条记录开始。 - `@PageSize`: 每页显示多少条记录。 例如: ```sql SELECT * FROM table LIMIT 5, 10; -- 获取第6条到第15条记录 SELECT * FROM table LIMIT 5; -- 获取前5条记录 SELECT...

    Oracle学习文档

    - **解释**: 先按照薪水降序排列所有记录,然后选取前3条记录。 ### 4. 分页查询 - **语法**: - 查询第1-5条记录: `SELECT * FROM (SELECT rownum num, s_emp.* FROM s_emp) WHERE num &gt;= 1 AND num ;` - 按照...

    关于SQL Server SQL语句查询分页数据的解决方案

    这种方法首先选择表中前29条记录(倒序排列),然后再从这29条记录中选择前20条正序排列的记录。 ### Oracle数据库中的分页查询 在Oracle数据库中,实现分页查询的方法略有不同,主要是利用`ROWNUM`函数。例如,从...

    SQL 是用于访问和处理数据库的标准的计算机语言

    在实际应用中,`SELECT TOP`常用于数据分页、快速查看大表的前几条记录、或者在大数据分析中进行采样等场景。熟练掌握`SELECT TOP`的使用,能显著提高数据库操作的效率,尤其是在需要对大量数据进行处理时。 附带的...

    数据库分页语句.pdf

    在这种情况下,我们简单地跳过前几页的记录,然后读取需要的10条记录: ```java for (int j = 0; j (pageNo - 1) * pageSize; j++) { rs.next(); } while (rs.next() && i ) { i++; out.println(rs.getString(1))...

    T-SQL 高级语句

    例如,在一个大型表中,如果我们只需要查看前几条记录,可以使用TOP关键字指定返回的记录数。在SQL Server中,语法是`SELECT TOP number|percent column_name(s) FROM table_name`。如果`number`是一个数字,它将...

    SQL排序查询_IT文库

    在SQL中,我们可以使用TOP关键字(在某些数据库系统中称为LIMIT或FETCH FIRST)来选取结果集的前N条记录。这在需要找出排名靠前或靠后的记录时非常有用。例如,在学生考试成绩排名的场景中,我们可能只关心成绩排在...

    第05章_排序与分页1

    正确的做法是先用`ORDER BY`排序,然后在外部查询中使用`ROWNUM`过滤出前几条记录。 分页查询是数据库操作中的重要技巧,它允许用户逐步浏览大型数据集,而不会一次性加载所有数据,从而提高用户体验并减轻服务器...

    SQL试卷.docx

    4. `TOP`关键字用于选取查询结果的前几条记录。例如,`SELECT TOP 5 FROM students ORDER BY Grade DESC`将返回成绩最高的前五名学生。`ASC`和`DESC`分别代表升序和降序排序。 5. 聚合函数在SQL中用于对一组值进行...

    sql 取两值之间的数据方法(例:100-200之间的数据)

    外层`TOP 100`用于选取100条数据,内层`TOP 200`则先选取前200条数据,然后按照时间降序排序,这样可以确保选取的是原始表中的100到200条数据。 ```sql SELECT TOP 100 * FROM (SELECT TOP 200 * FROM table ...

    SQL语法大全

    rs.pagesize=N 设置每页为N条记录 rs.pagecount 根据 pagesize 的设置返回总页数 rs.recordcount 返回记录总数 rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否 rs.eof 返回记录指针是否超出数据表...

Global site tag (gtag.js) - Google Analytics