SQL语句实现真分页查找

         SQL如何返回指定条数的记录?即如何实现真分页查询。而不是把查询到的所有查询结果放在结果集或collection中。在面对大量结果换回时,这种方式显得十分消耗资源。而且效率很低。 

   通过动态的SQL查询可以实现从数据库返回指定条数的记录。前提是数据库列必须存在 AUTO_INCREMENT 。据说DATE列也可以实现,但应该没有AUTO_INCREMENT时间简单。

   要实现指定列数的返回,必须从SQL相关子查询开始。

   看下SQL语句:

      SELECT SNO,CNO FROM SC x WHERE Grade >= (SELECT AVG(Grade) FROM SC y WHERE y.SNO = x.SNO);

这就是相关子查询的一个例子。

 

先了解相关概念: x SC的别名,这倒不用说。但在此时它有成为元组变量,可以用来表示SC的一个元组。

 

现在分析它的执行过程:

1.       从外层查询取出SC的一个元组(此时X就代表一个实例元组,即此时x表数据库的一行记录),然后将x.SNO的值传给内层的y.SNO.

例如:此时数据库存在这样一组记录

 “200504284 c0123 89 87 65 ” (SNO,CNO,Grade)

当扫描到这里时,x就代表着这一列,这就是元组变量的意识。按照1的操作后,查询语句可以认为是这样:

 SELECT SNO,CNO FROM SC x WHERE Grade >= (SELECT AVG(Grade) FROM SC y WHERE y.SNO = ‘200504284’);   //查询成绩高于他所有课程平均成绩的学生的学号,课程号

        就演变成一个简单的嵌套查询了。

2.       执行内层查询,用该值替代内层查询,得到外层查询。

3.       执行外层查询,得到结果。

                                                                                                        

理解了相关子查询,真分页查询就容易了理解了,你想到了吗?

 

 对,就是利用AUTO_INCREMENT列。(假设定义id int AUTO_INCREMENT

实现取出第110条记录

 SELECT * FROM TABLE_NAME T1 WHERE ( SELECT COUNT(*) FROM TABLE_NAME T2 WHERE T2.id < T1.Id ) >= ‘0’ AND (SELECT COUNT(*)   FROM TABLE_NAME T2 WHERE   T2.id <T1.id ) <’ 10’ ;

 

这样就可以返回数据库的前十行记录。当然你也可能会觉得用一个很简单的查询就可以做到,何必这么麻烦呢?比如:

SELECT * FROM TABLE_NAME WHERE ID BETWEEN ‘1’ AND ‘10’ ;同样可以做到。

但请注意,当你不采用AUTO_INCREMENT列或你的AUTO_INCREMENT不连续(比如删除了其中的ID = 5,ID = 6的记录,那么此时返回的记录就只有8条了。采用DATE比较的方式或者数据没有太多规律(但可比较)的情况下,这个查询就显得力不从心了。

 

自己可以动手做的检验一遍。该SQL效率未经检验,希望大家提出意见。

posted on 2010-01-27 08:20 望见 阅读(2323) 评论(2)  编辑 收藏 引用 所属分类: SQL

评论

# re: SQL语句实现真分页查找 2010-01-27 10:53 路过

如果数据量很大的时候,这样写可能会让查询速度明显下降吧?不如以空间换时间,数据集放在服务器上,每次fetch回来一页。只是推测,最好还是亲自比较一下  回复  更多评论   

# re: SQL语句实现真分页查找[未登录] 2010-01-27 11:03

学习了  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2010年1月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

留言簿(1)

随笔分类(4)

随笔档案(4)

文章分类(2)

文章档案(2)

最新评论

阅读排行榜

评论排行榜