频道栏目
首页 > 资讯 > SQL Server > 正文

sql分页语句

17-09-14        来源:[db:作者]  
收藏   我要投稿

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

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

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不能以任何基表的名称作为前缀。

相关TAG标签
上一篇:MySQLMMM高可用方案
下一篇:mysql5.7.18更改密码是出现Unknowncolumn'password'in'fieldlist'错误
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站