`
shuai1234
  • 浏览: 980590 次
  • 性别: Icon_minigender_1
  • 来自: 山西
社区版块
存档分类
最新评论

Oracle与DB2、MySQL取前10条记录的对比

阅读更多
Oralce的示例:
1. 最佳选择:利用分析函数
row_number() over ( partition by col1 order by col2 )
比如想取出100-150条记录,按照tname排序

select tname,tabtype from (
select tname,tabtype,row_number() over ( order by tname ) rn from tab
)
where rn between 100 and 150;
2. 使用rownum 虚列
select tname,tabtype from (
select tname,tabtype,rownum rn from tab where rownum <= 150
)
where rn >= 100;
注释:使用序列时不能基于整个记录集合来进行排序,假如指定了order by子句,排序的的是选出来的记录集的排序。
create table mynumber(id int,name varchar(10));
insert into mynumber values(1,'no1');
insert into mynumber values(2,'no2');
insert into mynumber values(3,'no3');
insert into mynumber values(4,'no4');
insert into mynumber values(5,'no5');
insert into mynumber values(5,'no6');
insert into mynumber values(6,'no7');
insert into mynumber values(7,'no8');
insert into mynumber values(8,'no9');
insert into mynumber values(9,'no10');
insert into mynumber values(9,'no11');
insert into mynumber values(9,'no12');
insert into mynumber values(10,'no13');
insert into mynumber values(10,'no14');
insert into mynumber values(10,'no15');
insert into mynumber values(11,'no16');
insert into mynumber values(12,'no17');
insert into mynumber values(13,'no18');
select id,name,RANK() over ( order by id ) case1,
DENSE_RANK() over ( order by id ) case2,
row_number() over ( order by id ) case3 from mynumber;
(1) 取前10条不同id记录,假如最后1条记录的ID依然有相同的,那么取出来。
select id,name from mynumber where id in
(select id from (select distinct id
from mynumber) tt where rownum<=10);

select * from (select id,name,RANK()
over ( order by id ) case1,DENSE_RANK()
over ( order by id ) case2,row_number()
over ( order by id ) case3 from mynumber)
tt where case1<=10;
select * from (select id,name,RANK() over
( order by id ) case1,DENSE_RANK() over
( order by id ) case2,row_number() over
( order by id ) case3 from mynumber)
tt where case1 between 5 and 10;
(2)取前10条记录,假如第10条记录的ID 还有相同的,那么取出来。
select * from mynumber where id in
(select id from mynumber where rownum <=10);

select * from (select id,name,RANK()
over ( order by id ) case1,DENSE_RANK()
over ( order by id ) case2,row_number()
over ( order by id ) case3 from mynumber)
tt where case2<=10;
select * from (select id,name,RANK()
over ( order by id ) case1,DENSE_RANK()
over ( order by id ) case2,row_number()
over ( order by id ) case3 from mynumber)
tt where case2 between 5 and 10;

(3)取前10条记录
select id,name from mynumber
where rownum <=10;
select id,name from
(select id,name,rownum rn from
mynumber where rownum <= 10 ) where rn >= 5;

select * from (select id,name,RANK()
over ( order by id ) case1,DENSE_RANK()
over ( order by id ) case2,row_number()
over ( order by id ) case3 from mynumber)
tt where case3<=10;
select * from (select id,name,RANK()
over ( order by id ) case1,DENSE_RANK()
over ( order by id ) case2,row_number()
over ( order by id ) case3 from mynumber)
tt where case3 between 5 and 10;
Db2示例
create table mynumber(id int,name varchar(10))
insert into mynumber values(1,'no1')
insert into mynumber values(2,'no2')
insert into mynumber values(3,'no3')
insert into mynumber values(4,'no4')
insert into mynumber values(5,'no5')
insert into mynumber values(5,'no6')
insert into mynumber values(6,'no7')
insert into mynumber values(7,'no8')
insert into mynumber values(8,'no9')
insert into mynumber values(9,'no10')
insert into mynumber values(9,'no11')
insert into mynumber values(9,'no12')
insert into mynumber values(10,'no13')
insert into mynumber values(10,'no14')
insert into mynumber values(10,'no15')
insert into mynumber values(11,'no16')
insert into mynumber values(12,'no17')
insert into mynumber values(13,'no18')
select * from (select id,name,RANK() over
( order by id ) case1,DENSE_RANK() over
( order by id ) case2,row_number() over
( order by id ) case3 from mynumber) as tt where case1<=10
(1) 取前10条不同id记录,假如最后1条记录的ID依然有相同的,那么全部取出来。
select * from mynumber where id in
(select distinct id from mynumber fetch first 10 rows only)

select * from (select id,name,RANK()
over ( order by id ) case1,DENSE_RANK()
over ( order by id ) case2,row_number()
over ( order by id ) case3 from mynumber)
as tt where case1<=10
select * from (select id,name,RANK()
over ( order by id ) case1,DENSE_RANK()
over ( order by id ) case2,row_number()
over ( order by id ) case3 from mynumber)
as tt where case1 between 5 and 10
(2)取前10条记录,假如第10条记录的ID 还有相同的,那么全部取出来。
select * from mynumber where id in
(select id from mynumber fetch first 10 rows only)

select * from (select id,name,RANK()
over ( order by id ) case1,DENSE_RANK()
over ( order by id ) case2,row_number()
over ( order by id ) case3 from mynumber)
as tt where case2<=10
select * from (select id,name,RANK()
over ( order by id ) case1,DENSE_RANK()
over ( order by id ) case2,row_number()
over ( order by id ) case3 from mynumber)
as tt where case2 between 5 and 10
(3)取前10条记录
select id from mynumber fetch first 10 rows only

select * from (select id,name,RANK() over
( order by id ) case1,DENSE_RANK() over
( order by id ) case2,row_number() over
( order by id ) case3 from mynumber) as tt where case3<=10
select * from (select id,name,RANK()
over ( order by id ) case1,DENSE_RANK()
over ( order by id ) case2,row_number()
over ( order by id ) case3 from mynumber)
as tt where case3 between 5 and 10
Mysql示例:
select id from mytable order by update_date desc limit 0,10


ORACLE中取前N条记录
(2009-11-11 14:30:48)
转载
标签:
from
name
order
by
oracle
it
分类: 技术浅谈

1.在ORACLE中实现SELECT TOP N
由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询
简单地说,实现方法如下所示:
SELECT 列名1...列名n FROM
  (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
   WHERE ROWNUM <= N(抽出记录数)
    ORDER BY ROWNUM ASC

下面举个例子简单说明一下

顾客表customer(id,name)有如下数据:
ID NAME
01 first
02 Second
03 third
04 forth
05 fifth
06 sixth
07 seventh
08 eighth
09 ninth
10 tenth
11 last

则按NAME的字母顺抽出前三个顾客的SQL语句如下所示:
SELECT * FROM
  (SELECT * FROM CUSTOMER ORDER BY NAME)
   WHERE ROWNUM <= 3
    ORDER BY ROWNUM ASC
   
输出结果为:
  ID NAME
  08 eighth
  05 fifth
  01 first
 
2.在TOP N纪录中抽出第M(M <= N)条记录
在得到了TOP N的数据之后,为了抽出这N条记录中的第M条记录,我们可以考虑从ROWNUM着手。我们知道,ROWNUM是记录表中数据编号的一个隐藏字段,所以可以在得到TOP N条记录的时候同时抽出记录的ROWNUM,然后再从这N条记录中抽取记录编号为M的记录,即使我们希望得到的结果

从上面的分析可以很容易得到下面的SQL语句
SELECT 列名n...列名n FROM
  (SELECT ROWNUM RECNO, 列名n...列名n FROM
   (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
    WHERE ROWNUM <= N(抽出记录数)
     ORDER BY ROWNUM ASC )
      WHERE RECNO = M(M <= N)

同样以上表的数据为基础,那么得到以NAME的字母顺排序的第二个顾客的信息的SQL语句应该这样写:
SELECT ID, NAME FROM
   (SELECT ROWNUM RECNO, ID, NAME FROM
     (SELECT * FROM CUSTOMER ORDER BY NAME)
    WHERE ROWNUM <= 3
      ORDER BY ROWNUM ASC)
     WHERE RECNO = 2

结果则为:
ID NAME
05 fifth
3.抽出按某种方式排序的记录集中的第N条记录
在2的说明中,当M = N的时候,即为我们的标题讲的结果
实际上,2的做法在里面N>M的部分的数据是基本上不会用到的,我们仅仅是为了说明方便而采用
如上所述,则SQL语句应为:

SELECT 列名1...列名n FROM
  (SELECT ROWNUM RECNO, 列名1...列名n FROM
   (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
    WHERE ROWNUM <= N(抽出记录数)
     ORDER BY ROWNUM ASC )
      WHERE RECNO = N

那么,2中的例子的SQL语句则为:
SELECT ID, NAME FROM
  (SELECT ROWNUM RECNO, ID, NAME FROM
   (SELECT * FROM CUSTOMER ORDER BY NAME)
    WHERE ROWNUM <= 2
     ORDER BY ROWNUM ASC )
      WHERE RECNO = 2
结果为:
ID NAME
05 fifth

4.抽出按某种方式排序的记录集中的第M条记录开始的X条记录
3里所讲得仅仅是抽取一条记录的情况,当我们需要抽取多条记录的时候,此时在2中的N的取值应该是在
N >= (M + X - 1)这个范围内,当让最经济的取值就是取等好的时候了的时候了。当然最后的抽取条件也不是
RECNO = N了,应该是RECNO BETWEEN M AND (M + X - 1)了,所以随之而来的SQL语句则为:

SELECT 列名1...列名n FROM
  (SELECT ROWNUM RECNO, 列名1...列名n FROM
   (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n)
    WHERE ROWNUM <= N (N >= (M + X - 1))
     ORDER BY ROWNUM ASC)
      WHERE RECNO BETWEEN M AND (M + X - 1)

同样以上面的数据为例,则抽取NAME的字母顺的第2条记录开始的3条记录的SQL语句为:

SELECT ID, NAME FROM
  (SELECT ROWNUM RECNO, ID, NAME FROM
   (SELECT * FROM CUSTOMER ORDER BY NAME)
    WHERE ROWNUM <= (2 + 3 - 1)
     ORDER BY ROWNUM ASC )
      WHERE RECNO BETWEEN 2 AND (2 + 3 - 1)
     
结果如下:
ID NAME
05 fifth
01 first
04 forth

以此为基础,再扩展的话,做成存储过程,将开始记录数以及抽取记录数为参数,就可以轻松实现分页抽取数据。

分享到:
评论

相关推荐

    Oracle,DB2,mysql的驱动以及用Java连接数据库的方法

    Oracle、DB2和MySQL是三种非常流行的数据库管理系统,广泛应用于企业级应用、数据分析以及互联网服务。Java作为一种多平台支持的编程语言,常常被用来与这些数据库进行交互。本篇将详细介绍这三种数据库的驱动以及...

    数据迁移工具DB2DB和mysql to oracle

    迁移过程中,需要关注两个系统之间的数据类型差异,例如MySQL的VARBINARY与Oracle的BLOB,或者MySQL的ENUM与Oracle的CHAR/VARCHAR2。此外,还需要考虑事务处理、触发器、存储过程等高级特性在迁移过程中的转换,以及...

    oracle+mysql+db2 驱动包Jar

    总结来说,"JDBC_oracle+mysql+db2"这个压缩包包含了与Oracle、MySQL和DB2数据库交互所需的JDBC驱动,它们是Java开发者连接这三种数据库的重要工具。正确理解和使用这些驱动,能够帮助开发者高效地实现数据库操作,...

    oracle、db2、informix数据库的jdbc包

    这个"oracle、db2、informix数据库的jdbc包"包含的就是这三个数据库的JDBC驱动程序,使得Java开发者能够方便地与这些数据库进行交互。 1. **Oracle JDBC驱动**:Oracle数据库提供了多种JDBC驱动类型,包括 Thin、...

    DB2和ORACLE_应用开发差异比较

    - **重做日志文件(RedoLogFiles)**与**事务日志文件(TransactionLogFiles)**:Oracle的重做日志记录了所有修改数据库的事务,DB2使用事务日志记录类似的信息。 - **PL/SQL与SQL/PL**:Oracle使用PL/SQL作为过程...

    全能数据库管理软件,支持oracle mysql db2 mssql ,并且是免费的

    它提及了对Oracle、MySQL、DB2和MSSQL的支持,这些都是非常流行的关系型数据库管理系统。 Oracle是由甲骨文公司提供的一个全面的、集成的、开放的、先进的企业级数据库解决方案。它以其高可用性、高性能和安全性而...

    Oracle、DB2、MySql、SQLServer JDBC驱动

    Oracle、DB2、MySql、SQLServer JDBC驱动,包中还列出来连接的Class驱动名和Url Pattern,DB2包括Type 2、Type 3和Type 4三种模式。 博客:http://blog.csdn.net/beanjoy/article/details/9354377

    JDBC连接各种数据库的驱动(mySQL,SQLServer,Oracle,DB2,Access)

    本篇文章将深入探讨如何使用JDBC连接到不同类型的数据库,包括MySQL、SQL Server、Oracle、DB2和Access。 1. **MySQL驱动**: MySQL是一种开源、轻量级的关系型数据库管理系统,广泛应用于Web应用。在Java中,我们...

    Oracle,MySQL,DB2 【修改列】比较

    Oracle,MySQL,DB2 【修改列】方法比较,sql示例。 【1分】而已,下周10分钟后记得回来评论,可以返还积分哒!

    支持 oracle mysql sql server db2等数据库

    【标题】:“支持Oracle MySQL SQL Server DB2等数据库”意味着这款工具具备跨平台数据库管理的能力。这涵盖了市面上常见的四大关系型数据库管理系统(RDBMS),包括Oracle数据库、MySQL开源数据库、Microsoft SQL ...

    oracle ,sybase,mysql,db2各种数据库监控

    在本篇中,我们将详细探讨Oracle、Sybase、MySQL和DB2这四种常见数据库的监控重点和常用SQL监控脚本。 首先,Oracle数据库的监控主要包括以下几个方面: 1. **数据库配置**:包括数据库名、版本信息、位数和归档...

    oracle, db2, mysql. sqlserver2000的驱动jar包

    在IT行业中,数据库是数据管理和存储的核心工具,而Oracle、DB2、MySQL和SQL Server 2000是四种非常著名的数据库管理系统。这些系统各有特点,广泛应用于企业级应用、互联网服务以及各种规模的组织中。为了与这些...

    Mysql,Mssql,Oracle,DB2驱动包

    本压缩包包含了四大主流关系型数据库管理系统(RDBMS)的驱动包:MySQL、Microsoft SQL Server、Oracle和IBM DB2。这些驱动包使得Java应用程序能够通过Java Database Connectivity (JDBC) API与数据库进行通信。以下...

    mysql postgreSQL oracle 10g db2的安装和远程连接

    关于mysql postgreSQL oracle 10g ibm db2的安装 配置和远程连接文档 其中mysql和postgreSQL介绍了在linux下的相关过程

    MySQL,DB2,Oracle,SqlServer用到的jar

    MySQL、DB2、Oracle和SQL Server都是广泛使用的数据库管理系统,它们各自提供了用于Java应用程序连接的驱动程序,即JDBC(Java Database Connectivity)驱动。这里我们将深入探讨这些数据库系统的JAR文件以及如何...

    mssql、mysql、oracle、db2各数据库的jar驱动包

    本文将详细介绍mssql、mysql、oracle、db2这四种常见数据库的Java驱动包(JDBC驱动),它们是Java应用程序连接到这些数据库的重要桥梁。 1. **MSSQL (Microsoft SQL Server)** MSSQL是由微软公司开发的关系型...

    db2,mysql,berby,oracle,postgresql,sqlserver,sybase数据库驱动jar包

    DB2的驱动jar包(如`db2jcc4.jar`或`db2jcc.jar`)包含了与DB2服务器通信所需的类和接口,使得Java应用可以执行SQL语句,管理数据等。 2. **MySQL**:MySQL是一款开源、免费的数据库,被广泛用于Web应用。MySQL的...

    Toad Quest 9.6.1.1 for oracle mysql db2 keygen

    Toad Quest 9.6.1.1 for oracle mysql db2 keygen

    jdbc数据库连接所需的jar包驱动、mysql、oracle、db2

    本知识点将详细介绍如何使用JDBC与MySQL、Oracle、DB2等数据库进行连接,并涉及所需的JAR包驱动。 首先,JDBC是一个Java API,允许Java应用程序与各种类型的数据库进行交互。为了实现这一功能,我们需要对应的...

Global site tag (gtag.js) - Google Analytics