`

MySQL中的ROWNUM的实现

阅读更多

本文转自

http://blog.csdn.net/ACMAIN_CHM/archive/2009/04/20/4095531.aspx

 

非常感谢!!!

 

MySQL 几乎模拟了 Oracle,SQL Server等商业数据库的大部分功能,函数。但很可惜,到目前的版本(5.1.33)为止,仍没有实现ROWNUM这个功能。

下面介绍几种具体的实现方法.

建立实验环境如下

mysql> create table tbl (
    ->  id      int primary key,
    ->  col     int
    -> );
Query OK, 0 rows affected (0.08 sec)

mysql> insert into tbl values
    -> (1,26),
    -> (2,46),
    -> (3,35),
    -> (4,68),
    -> (5,93),
    -> (6,92);
Query OK, 6 rows affected (0.05 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql>
mysql> select * from tbl order by col;
+----+------+
| id | col  |
+----+------+
|  1 |   26 |
|  3 |   35 |
|  2 |   46 |
|  4 |   68 |
|  6 |   92 |
|  5 |   93 |
+----+------+
6 rows in set (0.00 sec)

 


1. 直接在程序中实现;
这应该算是效率最高的一种,也极为方便。直接在你的开发程序中(PHP/ASP/C/...)等中,直接初始化一个变量nRowNum=0,然后在while 记录集时,nRowNum++; 然后输出即可。

 

2. 使用MySQL变量;在某些情况下,无法通过修改程序来实现时,可以考虑这种方法。
缺点,@x 变量是 connection 级的,再次查询的时候需要初始化。一般来说PHP等B/S应用没有这个问题。但C/S如果connection一只保持则要考虑 set @x=0

mysql> select @x:=ifnull(@x,0)+1 as rownum,id,col
    -> from tbl
    -> order by col;
+--------+----+------+
| rownum | id | col  |
+--------+----+------+
|      1 |  1 |   26 |
|      1 |  3 |   35 |
|      1 |  2 |   46 |
|      1 |  4 |   68 |
|      1 |  6 |   92 |
|      1 |  5 |   93 |
+--------+----+------+
6 rows in set (0.00 sec)

 

3. 使用联接查询(笛卡尔积)
缺点,显然效率会差一些。

利用表的自联接,代码如下,你可以直接试一下 select a.*,b.* from tbl a,tbl b where a.col>=b.col 以理解这个方法原理。

mysql> select a.id,a.col,count(*) as rownum
    -> from tbl a,tbl b
    -> where a.col>=b.col
    -> group by a.id,a.col;
+----+------+--------+
| id | col  | rownum |
+----+------+--------+
|  1 |   26 |      1 |
|  2 |   46 |      3 |
|  3 |   35 |      2 |
|  4 |   68 |      4 |
|  5 |   93 |      6 |
|  6 |   92 |      5 |
+----+------+--------+
6 rows in set (0.00 sec)

 

4. 子查询

缺点,和联接查询一样,具体的效率要看索引的配置和MySQL的优化结果。

mysql> select a.*,
    ->  (select count(*) from tbl where col<=a.col) as rownum
    -> from tbl a;
+----+------+--------+
| id | col  | rownum |
+----+------+--------+
|  1 |   26 |      1 |
|  2 |   46 |      3 |
|  3 |   35 |      2 |
|  4 |   68 |      4 |
|  5 |   93 |      6 |
|  6 |   92 |      5 |
+----+------+--------+
6 rows in set (0.06 sec)

 

做为一款开源的数据库系统,MySQL无疑是一个不做的产品。它的更新速度,文档维护都不逊于几大商业数据库产品。估计在下一个版本中,我们可以看到由MySQL自身实现的ROWNUM。

分享到:
评论

相关推荐

    mysql实现rownum和上一条,下一条功能

    1.或许有的人会用id+limit来实现上一条,下一条功能.但是.我们试想一下.有的业务并不是用id来排序的.那这样的方法就没效果了. 2.现在找到了生成rownum的方法,并且优化了执行速度. 3.直接上我项目里的sql,希望对大家...

    C# Mysql 查询 Rownum的解决方法

    在C#中与MySQL数据库进行交互时,有时候我们需要实现类似SQL中的行号功能,即Rownum。在Oracle数据库中,Rownum是一个内置的伪列,可以直接在查询语句中使用,但在MySQL中,情况有所不同。这篇内容将详细介绍如何在...

    mysql类似oracle rownum写法实例详解

    在 MySQL 中,由于没有 `ROWNUM`,我们需要借助变量来实现类似功能。这里我们可以创建一个用户定义变量 `@rownum`,并在查询中更新它的值。下面的示例展示了如何在 MySQL 中模拟批量插入的场景: ```sql SET @...

    oracle rownum 的使用 和sqlserver有区别的!

    本文将详细介绍 Oracle 中 ROWNUM 的使用方法,并与 SQL Server 中相应的功能进行对比分析。 #### Oracle ROWNUM 基础用法 1. **ROWNUM 的默认行为:** - 在 Oracle 中,ROWNUM 默认从 1 开始计数,对于每一行...

    Oracle,SQl,MySql实现分页查询

    本文将基于提供的文件信息,深入探讨三种不同的分页查询方法及其在Oracle、SQL Server(这里用SQL代替)、MySQL中的实现方式,并对它们的性能进行对比分析。 #### 分页方案一:利用Not In和SELECT TOP分页 **基本...

    Oracle Sql语句转换成Mysql Sql语句

    在转换过程中,需要将Oracle的ROWNUM替换为MySQL的LIMIT子句。 3. **连接查询**:Oracle的JOIN语法允许在ON条件中使用子查询,而在MySQL中,子查询通常需要移到FROM或WHERE子句中。 4. **游标**:Oracle SQL支持...

    MySQL分组排序功能

    本文将详细介绍如何在MySQL中实现类似Oracle中`row_number() over (partition by)`的功能,即按照指定列进行分组,并在每个分组内进行排序。 #### 实现步骤详解 ##### 1. 创建示例表与数据 首先,我们需要创建一...

    用Distinct在MySQL中查询多条不重复记录值,绝对的物有所值

    在IT行业的数据库管理与开发领域,SQL语言是不可或缺的一部分,尤其在关系型数据库如MySQL中,其作用更是举足轻重。今天,我们将深入探讨如何使用`DISTINCT`关键字在MySQL中查询多条不重复记录值,这不仅是一种实用...

    Mysql转oracle工具

    例如,MySQL支持的`LIMIT`在Oracle中需用`ROWNUM`或`FETCH FIRST`来实现分页;MySQL的`INFORMATION_SCHEMA`在Oracle中对应的是`DBA_`或`USER_`视图;此外,存储过程、触发器和函数的语法也有区别。 2. **数据类型...

    Oracle中实现MySql中limit+SqlServer分页+分页的存储过程

    本篇文章将探讨如何在Oracle数据库中实现类似MySQL的`LIMIT`分页功能,以及如何模拟SQL Server的分页方式,并介绍`INTERSECT`和`MINUS`这两个SQL运算符。 首先,`INTERSECT`运算符用于找出两个或多个查询结果中的...

    MySQL的PPT文档

    - **翻页查询语句**:MySQL中使用`LIMIT`关键字来实现翻页查询,而Oracle中则使用`ROWNUM`来实现。 - **日期字段处理**:MySQL中的日期字段类型有`DATE`、`TIME`等,而Oracle中使用统一的`DATE`类型。 - **字符串...

    MYSQL获取行号row_no

    然而MySQL并未直接提供与Oracle完全相同的功能,因此我们需要通过其他方式来实现这一需求。本文将详细介绍几种在MySQL中获取结果集行号的方法,并探讨它们的适用场景与局限性。 #### 方法一:使用变量自增 这种...

    oracle scott 转成mysql 的表学习应用

    例如,Oracle中用ROWNUM伪列进行分页,而在MySQL中则使用LIMIT和OFFSET。 最后,了解和实践这个过程可以帮助我们更好地理解和比较两种数据库系统的特性,从而在实际工作中更高效地处理跨平台的数据迁移和管理任务。...

    mySql与oracle分页技术

    本文将深入探讨MySQL与Oracle两种常用的数据库管理系统中的分页技术。 首先,我们来看MySQL的分页技术。MySQL提供了`LIMIT`子句来实现分页查询。`LIMIT m, n`语句用于限制查询结果的数量,其中`m`是起始索引,`n`是...

    mysql转换到oracle数据库

    - **Oracle**:利用`ROWNUM`实现分页。 **3. DATE类型处理** - **MySQL**:DATE类型的灵活性较高,支持更多的日期格式和操作。 - **Oracle**:相对较为固定,但提供了丰富的日期函数支持。 **4. LEFT函数** - ...

    mysql和Oracle命令的区别

    而在 Oracle 中,由于没有直接的 `OFFSET`,通常需要通过 `ROWNUM` 列配合子查询来实现分页。两种常见的 Oracle 分页查询方式如下: - 语句一: ``` SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ...

    从mysql转换到oracle数据库.docx

    2. Limit:MySQL 中一般采用 `limit` 去实现分页功能,而 Oracle 中一般采用 `rownum` 去实现分页。 3. Date:两种数据库对日期的处理也不一样,MySQL 中更加灵活。 4. LEFT 函数:Oracle 中没有相同的函数,我们...

    很好JSP中mysql oracle 真分页组件

    总之,真分页组件在JSP中处理MySQL和Oracle数据库时,主要是通过数据库特有的SQL语法来实现,如MySQL的`LIMIT`和Oracle的`ROWNUM`。在JavaBean中,我们可以编写方法来封装这些SQL,以实现动态分页。在实际项目开发中...

    一个关于基于ssm,mysql(也含oracle方式)实现的分页查询.rar

    在MySQL数据库中实现分页查询,通常会用到LIMIT和OFFSET关键字。LIMIT用于指定返回结果集的数量,OFFSET则用来跳过多少条记录。例如,如果我们想要获取第2页,每页显示10条数据,SQL语句可能如下: ```sql SELECT *...

    mysql分页实例

    在旧版本中,一种更高效的分页策略是使用`JOIN`和自连接来实现,这种方法被称为“书签分页”: ```sql SELECT t1.* FROM ( SELECT t.*, (@rownum:=@rownum+1) as row_number FROM your_table t, (SELECT @rownum:...

Global site tag (gtag.js) - Google Analytics