设为首页 收藏本站
查看: 917|回复: 0

[经验分享] 数据库分页SQL语句

[复制链接]

尚未签到

发表于 2016-11-10 11:09:18 | 显示全部楼层 |阅读模式
  
 
SQL Server ---------------------------------------------------------------------------------
从数据库表中的第M条记录开始取N条记录,利用Top关键字:注意如果Select语句中既有top,又有order by,则是从排序好的结果集中选择:
 SELECT *
   FROM  ( SELECT Top N *
         FROM    (SELECT Top (M + N - 1) * FROM 表名称 Order by 主键 desc) t1 ) t2
              Order by 主键 asc
 
 例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:
     SELECT *
       FROM ( SELECT TOP 20 *
                           FROM (SELECT TOP 29 * FROM Sys_option order by sys_id desc) t1) t2
           Order by sys_id asc
 
 Oralce数据库--------------------------------------------------------------------------------
从数据库表中第M条记录开始检索N条记录
     SELECT *
           FROM (SELECT ROWNUM r,t1.* From 表名称 t1 where rownum < M + N) t2
           where t2.r >= M
     例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:
      SELECT *
           FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2
            Where t2.R >= 10
   如果你对Oracle数据库分页不是很熟悉的话,本页后面有专门对Oracle分页技术的讲解。
  
   My sql数据库---------------------------------------------------------------------------------------------
     My sql数据库最简单,是利用mysql的LIMIT函数,LIMIT [offset,] rows从数据库表中M条记录开始检索N条记录的语句为:
           SELECT * FROM 表名称 LIMIT M,N
 
            例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:
            select * from sys_option limit 10,20
*******************************************************************************************************************
 
 
楼主问的是mysql下的吧
"QUERY_SQL limit ?,?" 
QUERY_SQL 就是查询语句,比如select sno,sname from student limit 1,15;
 使用limit关键字,第一个"?"是起始行号,
  第二个"?"是返回条目数
=====================================================
另外提供给LZ其他数据库的分页语句
Oracle
  SELECT * FROM
 ( SELECT A.*, ROWNUM RN   FROM 
 (QUERY_SQL ) A   WHERE ROWNUM
 <= ?) WHERE RN >= ?
  结合rownum关键字,利用嵌套三层select
 语句实现。第一个"?"表示终止行号,
  第二个"?"表示其实行号
==============================================
 Sql Server
  尚无通用语句  可使用top n来返回前n条记录或使用存储过程
================================================
 DB2
  假设查询语句:select t1.* from t1 order
 by t1.id; 分页语句可为:
 "select * from ( select rownumber() over
  (order by t1.id) as row_, t1.* from t1
  order by t1.id) as temp_ where row_
  between ?+1 and ?"   返回两个"?"之间的记录
===================================================
 InterBase
  “QUERY_SQL row ? to ?”   返回两个"?"之间的记录
 PostgreSQL  “QUERY_SQL limit ? offset ?”   第一个"?"为起始行号,第二个"?"代表
  返回记录数
 
 
***************************************************************************************************************
 
 
 mysql 用的是limit sqlser用的是top oracle用的是rownumber
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
数据库分页查询
在这里主要讲解一下MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法。可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用总结归纳一下,以方便大家查询使用。
下面就分别给大家介绍、讲解一下三种数据库实现分页查询的方法。
一、       MySQL 数据库分页查询
MySQL数据库实现分页比较简单,提供了LIMIT函数。一般只需要直接写到sql语句后面就行了。
LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数,第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数。例如:
select * from table WHERE … LIMIT 10; #返回前10行
select * from table WHERE … LIMIT 0,10; #返回前10行
select * from table WHERE … LIMIT 10,20; #返回第10-20行数据
 
二、       SQLServer数据库分页查询
SQLServer数据库又分为SQLServer2000和SQLServer2005。一般比较简单的方法是通过TOP函数来实现。如下:
SELECT TOP 10 * FROM sql WHERE (
code NOT IN  (SELECT TOP 20 code  FROM TestTable  ORDER BY id))
 ORDER BY ID
这条语句,从理论上讲,整条语句的执行时间应该比子句的执行时间长,但事实相反。因为,子句执行后返回的是20条记录,而整条语句仅返回10条语句,所以影响数据库响应时间最大的因素是物理I/O操作。而限制物理I/O操作此处的最有效方法之一就是使用TOP关键词了。TOP关键词是SQL SERVER中经过系统优化过的一个用来提取前几条或前几个百分比数据的词。
以上语句的有一个致命的缺点,就是它含有NOT IN字样,要换成用not exists来代替not in,二者的执行效率实际上是没有区别的。
在以上分页算法中,影响我们查询速度的关键因素有两点:TOP和NOT IN。TOP可以提高我们的查询速度,而NOT IN会减慢我们的查询速度,所以要提高我们整个分页算法的速度,就要彻底改造NOT IN,同其他方法来替代它。
我们知道,几乎任何字段,我们都可以通过max(字段)或min(字段)来提取某个字段中的最大或最小值,所以如果这个字段不重复,那么就可以利用这些不重复的字段的max或min作为分水岭,使其成为分页算法中分开每页的参照物。在这里,我们可以用操作符“>”或“<”号来完成这个使命。如:
 
Select top 10 * from table1 where id>200
 
  于是就有了如下分页方案:
 
select top 页大小 *
 
from table1
 
where id>
 
      (select max (id) from
 
      (select top ((页码-1)*页大小) id from table1 order by id) as T
 
       )    
 
  order by id
 
这种方法执行多少始终没有大的降势,后劲仍然很足。尤其对于数据量大的时候,该方法执行速度一点也不会降低。
使用TOP要求主键必须唯一,不能是联合主键。如果是联合主键,则查询出的结果会乱序的。
目前SQLServer2005提供了一个row_number()函数。ROW_NUMBER() 就是生成一个顺序的行号,而他生成顺序的标准,就是后面紧跟的OVER(ORDER BY ReportID),其中ReportID可以是联合主键。下面,我们看看怎么具体应用这个RowNo进行分页.
SELECT TOP 10 *  FROM
(
       SELECT top 10 ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo
       FROM TABLE
      ) AS A
      WHERE RowNo > " + pageIndex*10
pageIndex就是我们需要数据的页数.
 
但对于SQLServer2000的话,如果是联合主键,我还没有解决办法,如果大家有可跟我联系。谢谢大家了。
 
三、       ORCALE数据库分页查询
ORCALE数据库实现分页查询可以使用row_number()函数或者使用rownum 虚列两种方法。
第一种:利用分析函数row_number() 方法
select * from(
select t.*,row_number() over (order by t1.id) rowno from TABLE1
)
where rowno between 21 and 40;
 
第二种:直接使用rownum 虚列
select * from
(select t.*,rownum as rowno from TABLE1 )
where rowno between 10 and 20
这两种方法比较,显然第二种方法比较好。因为不用order by语句,会提高检索数据的速度的,尤其数据量越大时,第二种方法快速检索数据越明显。
最后提醒大家:oracle中慎用带有order by的分页。尤其是在oracle10g中,会出现会引起混乱,即相同记录会出现在不同页中。
 
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-298405-1-1.html 上篇帖子: 使用php sql 2005 数据迁移 下篇帖子: Transact SQL教程(四)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表