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)
实现取出第1~10条记录
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效率未经检验,希望大家提出意见。