sql page 整理

2018-04-04 Database

整理各个数据库的 page sql 方法

mysql

-- 1. 传统方式,越往后分页 LIMIT 语句的偏移量就会越大,速度也会明显变慢
select * from table limit m,n; --其中 m 是指记录开始的 index,从0开始,表示第一条记录. n 是指从第 m+1 条开始,取 n 条。
SELECT * FROM table LIMIT 5,10;  // 检索记录行 6-15
SELECT * FROM table LIMIT 5;     //检索前 5 个记录行

-- 2. 使用子查询优化
SELECT * FROM articles WHERE  id >=  (
  SELECT id FROM articles WHERE 1=1 ORDER BY id LIMIT 10000, 1
) LIMIT 10

-- 3. 只提供上一页、下一页的链接形式
SELECT * FROM message WHERE id>1020 ORDER BY id ASC LIMIT 20;  //下一页
SELECT * FROM message WHERE id<1000 ORDER BY id DESC LIMIT 20; //上一页

oracle

采用以下实例即可:

SELECT *
  FROM (SELECT A.*, ROWNUM RN
          FROM (SELECT * FROM TABLE_NAME where 1=1 and 2=2) A
         WHERE ROWNUM <= 40)
 WHERE RN >= 21;

其中最内层的查询 SELECT * FROM TABLE_NAME 表示不进行翻页的原始查询语句。ROWNUM <= 40RN >= 21 控制分页查询的每页的范围。

上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。

在上面的分页查询语句中,这种考虑主要体现在 WHERE ROWNUM <= 40 这句上。

ms sqlserver

SELECT TOP 页大小 *
FROM
    (
        SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
    )   as A
WHERE RowNumber > 页大小*(页数-1);
--注解:首先利用Row_number()为table1表的每一行添加一个行号,给行号这一列取名'RowNumber' 在over()方法中将'RowNumber'做了升序排列
--然后将'RowNumber'列 与table1表的所有列 形成一个表A
--重点在where条件。假如当前页(currentPage)是第2页,每页显示10个数据(pageSzie)。那么第一页的数据就是第11-20条
--所以为了显示第二页的数据,即显示第11-20条数据,那么就让RowNumber大于 10*(2-1) 即:页大小*(当前页-1)

Search

    Post Directory