sql分页语句

来源:互联网 发布:快乐大本营知乎 编辑:程序博客网 时间:2024/06/17 14:02

取出表中第31-40条记录,主键是ID且自增:

1、在MySql中使用limit,如select * from tablename order by id limit 31,10;

2、Oracle中使用到rownum,如select * from (select rownum r,* from tablename where r<=40) where r>30;

下面介绍下rownum:

ROWNUM是一个虚假的列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简言之 rownum 是对符合条件结果的序列号,总是从1开始排起。所以选出的结果不可能没有1,而有其他大于1的值。一个ROWNUM值不是被永久的分配给一行 ,表中的某一行实际上也并没有标号;比如rownum >10 没有记录,因为第一条不满足去掉的话,第二条的rownum又成了1,所以永远没有满足条件的记录。或者理解为: ROWNUM是一个序列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。

select rownum,* from tablename where rownum != 10;只能返回前9条数据,因为rownum 为9后,下一个记录的 rownum为10。条件是!=10,所以不会取出,之后的记录rownum又是10,同理不会取出。

rownum >1 时查不到记录,而 rownum >0 或 rownum >=1 却可以查询到记录。这是因为 rownum 是在查询到的结果集后加上去的,总是从1开始。同理使用between...and时,要从0开始。

如果想要用 rownum > 10 这样的条件,就要用嵌套语句,把 rownum 先生成,然后对它进行查询。如 select * from (select rownum r,* from tablename where ...) where r>num;对结果集的分页即如此。

ROWNUM值何时被分配呢?分配是在查询的谓词解析之后,任何排序和聚合之前进行的。ROWNUM值只有当被分配之后才会增长,因此下面的查询没有返回结果: select * from tablename where rownum>1; ROWNUM > 1对于第一行来说并不是真值,ROWNUM没有增长到 2。

rowid 与 rownum 都被称为伪列,但存在方式不一样。rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有 rownum那些情况发生。 另外注意:rownum不能以任何基表的名称作为前缀。

原创粉丝点击