首页 > 数据库 > 数据库开发技术 > SQL案例分析:窗口函数实现高效分页查询
-- Oracle、SQL Server、PostgreSQL
SELECT emp_name, sex, email
FROM employee
ORDER BY emp_id
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
-- MySQL、PostgreSQL、SQLite
SELECT emp_name, sex, email
FROM employee
ORDER BY emp_id
LIMIT 10 OFFSET 10;
SELECT COUNT(*)
FROM employee;
COUNT(*)|
--------+
25|
TOTAL_ROWS,总记录数;
CURRENT_PAGE,当前所在页码;
MAX_PAGE_SIZE,每一页最多显示的记录数,例如 10、20、50;
ACTUAL_PAGE_SIZE,当前页实际包含的记录数;
ROW_NBR,每条记录的实际偏移量;
LAST_PAGE,当前页是否是最后一页。
-- Oracle、SQL Server、PostgreSQL
WITH e AS ( -- 初始查询
SELECT emp_id, emp_name, sex, email
FROM employee
),
t AS (
SELECT emp_id, emp_name, sex, email,
COUNT(*) OVER () AS total_rows, -- 总记录数
ROW_NUMBER () OVER (ORDER BY e.emp_id) AS row_nbr -- 偏移量,ORDER BY和初始查询相同
FROM e
ORDER BY e.emp_id -- 排序
OFFSET 10 ROWS -- 分页
FETCH NEXT 10 ROWS ONLY
)
SELECT
emp_id, emp_name, sex, email,
COUNT(*) OVER () AS actual_page_size, -- 当前页实际记录数
CASE MAX(row_nbr) OVER ()
WHEN total_rows THEN 'Y'
ELSE 'N'
END AS last_page, -- 是否最后一页
total_rows, -- 总记录数
row_nbr, -- 每一条数据的偏移量
((row_nbr - 1) / 10) + 1 AS current_page -- 当前所在页码
FROM t
ORDER BY emp_id;
-- MySQL、PostgreSQL、SQLite
WITH e AS ( -- 初始查询
SELECT emp_id, emp_name, sex, email
FROM employee
),
t AS (
SELECT emp_id, emp_name, sex, email,
COUNT(*) OVER () AS total_rows, -- 总记录数
ROW_NUMBER () OVER (ORDER BY e.emp_id) AS row_nbr -- 偏移量,ORDER BY和初始查询相同
FROM e
ORDER BY e.emp_id -- 排序
LIMIT 10
OFFSET 10 ROWS -- 分页
)
SELECT
emp_id, emp_name, sex, email,
COUNT(*) OVER () AS actual_page_size, -- 当前页实际记录数
CASE MAX(row_nbr) OVER ()
WHEN total_rows THEN 'Y'
ELSE 'N'
END AS last_page, -- 是否最后一页
total_rows, -- 总记录数
row_nbr, -- 每一条数据的偏移量
((row_nbr - 1) / 10) + 1 AS current_page -- 当前所在页码
FROM t
ORDER BY emp_id;
emp_id|emp_name|sex|email |actual_page_size|last_page|total_rows|row_nbr|current_page|
------+--------+---+-------------------+----------------+---------+----------+-------+------------+
11|关平 |男 |guanping@shuguo.com| 10|N | 27| 11| 2|
12|赵氏 |女 |zhaoshi@shuguo.com | 10|N | 27| 12| 2|
13|关兴 |男 |guanxing@shuguo.com| 10|N | 27| 13| 2|
14|张苞 |男 |zhangbao@shuguo.com| 10|N | 27| 14| 2|
15|赵统 |男 |zhaotong@shuguo.com| 10|N | 27| 15| 2|
16|周仓 |男 |zhoucang@shuguo.com| 10|N | 27| 16| 2|
17|马岱 |男 |madai@shuguo.com | 10|N | 27| 17| 2|
18|法正 |男 |fazheng@shuguo.com | 10|N | 27| 18| 2|
19|庞统 |男 |pangtong@shuguo.com| 10|N | 27| 19| 2|
20|蒋琬 |男 |jiangwan@shuguo.com| 10|N | 27| 20| 2|
原文作者:SQL编程思想;如有侵权,请联系管理员删除。