SQL编程思想:基于5种主流数据库代码实现
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人


2.4.2 数据分页显示

有时候查询的结果可能包含成千上万条记录,因此在前端显示时需要采用分页的方式,也就是每次只显示一定数量(例如10条记录)的结果,同时提供“下一页”“上一页”等翻页按钮。这种分页查询的原理就是先跳过指定的行数,返回随后的N条记录。实际上,Top-N排行榜是分页查询的一种特殊情况。

分页查询也有两种实现方式,第一种方式就是使用SQL标准中的FETCH和OFFSET子句。假如前端页面每次显示10名员工记录,现在用户点击了“第2页”,也就是返回第11条到第20条记录。我们可以使用以下查询语句:

其中,ORDER BY子句表示按照月薪从高到低进行排序,OFFSET子句表示跳过10条记录,FETCH子句表示获取随后的10条记录。查询返回的结果如下:

除以上基本的用法外,FETCH子句还支持一些扩展选项,完整的语法如下:

其中,方括号([])表示可选项,大括号({})表示必选项,竖线(|)表示二选一。每个选项的作用如下:

● OFFSET表示偏移量,即从第m+1行开始返回数据。默认偏移量为0,表示从第1行开始返回。ROW和ROWS关键字等价。

● FETCH表示返回多少数据,FIRST和NEXT关键字等价。

● num_rows表示以行数为单位限制返回的数据,n PERCENT表示按照百分比限制返回的数据,ROW和ROWS关键字等价。

● ONLY和WITH TIES的区别在于,最后如果有多个排名相同的记录,WITH TIES会返回更多的数据,ONLY则不会返回更多的数据。

目前只有Oracle 12c以上版本完全支持n PERCENT和WITH TIES选项,例如:

查询返回的结果如下:

由于员工表中共有25名员工,10%约为3人。

以下查询使用了WITH TIES选项:

查询返回的结果如下:

由于“诸葛亮”和“张飞”的月薪相同,使用WITH TIES子句时返回了4条记录。

另外,PostgreSQL 13开始支持WITH TIES选项。

实现分页查询的第二种方式就是利用LIMIT和OFFSET子句,例如:

其中,ORDER BY子句表示按照月薪从高到低进行排序,OFFSET子句表示跳过10条记录,LIMIT子句获取随后的10条记录。

MySQL和SQLite中以下两种语法的作用相同,注意偏移量n和返回行数m出现的顺序: