首页 > 数据库 > 数据库开发技术 > 五种主流数据库:排行榜与分页查询
| 限定查询结果数量 | MySQL | Oracle | SQL Server | PostgreSQL | SQLite |
|---|---|---|---|---|---|
| Top排行榜 | LIMIT | FETCH、ROWNUM | FETCH OFFSET、TOP | FETCH、LIMIT | LIMIT |
| 分页查询 | LIMIT OFFSET | FETCH OFFSET、ROWNUM | FETCH OFFSET | FETCH OFFSET、LIMIT OFFSET | LIMIT OFFSET |
-- Oracle、Microsoft SQL Server 以及 PostgreSQL
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
OFFSET 0 ROWS
FETCH FIRST 5 ROWS ONLY;
emp_name|salary
--------|--------
刘备 |30000.00
关羽 |26000.00
张飞 |24000.00
诸葛亮 |24000.00
赵云 |15000.00
-- MySQL、PostgreSQL 以及 SQLite
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
LIMIT 5 OFFSET 0;
-- Oracle
SELECT *
FROM (
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
)
WHERE rownum <= 5;
-- Microsoft SQL Server
SELECT TOP(5) emp_name, salary
FROM employee
ORDER BY salary DESC;
-- Oracle、Microsoft SQL Server 以及 PostgreSQL
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
OFFSET 10 ROWS
FETCH FIRST 10 ROWS ONLY;
emp_name|salary
--------|-------
关兴 |7000.00
关平 |6800.00
赵氏 |6600.00
...
简雍 |4800.00
孙乾 |4700.00
[OFFSET m {ROW | ROWS}]
FETCH {FIRST | NEXT} [num_rows | n PERCENT] {ROW | ROWS} {ONLY | WITH TIES};
OFFSET 表示偏移量,即从第 m+1 行开始返回数据。默认偏移量为 0,表示从第 1 行开 始返回。ROW 和 ROWS 关键字等价。
FETCH 表示返回多少数据,FIRST 和 NEXT 关键字等价。
num_rows 表示以行数为单位限制返回的数据,n PERCENT 表示按照百分比限制返回的 数据,ROW 和 ROWS 关键字等价。
ONLY 和 WITH TIES 的区别在于,最后如果有多个排名相同的记录,WITH TIES 会返 回更多的数据,ONLY 则不会返回更多的数据。
-- Oracle
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
FETCH FIRST 10 PERCENT ROWS ONLY;
EMP_NAME|SALARY
--------|------
刘备 | 30000
关羽 | 26000
张飞 | 24000
-- Oracle
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
FETCH FIRST 10 PERCENT ROWS WITH TIES;
EMP_NAME|SALARY
--------|------
刘备 | 30000
关羽 | 26000
张飞 | 24000
诸葛亮 | 24000
-- PostgreSQL
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
FETCH FIRST 3 ROWS WITH TIES;
emp_name|salary |
--------+--------+
刘备 |30000.00|
关羽 |26000.00|
诸葛亮 |24000.00|
张飞 |24000.00|
-- Microsoft SQL Server
SELECT TOP(10) PERCENT WITH TIES
emp_name, salary
FROM employee
ORDER BY salary DESC;
emp_name|salary |
--------+--------+
刘备 |30000.00|
关羽 |26000.00|
张飞 |24000.00|
诸葛亮 |24000.00|
-- Oracle
SELECT *
FROM (SELECT emp_name, salary, rownum rn
FROM (
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
)
WHERE rownum <= 20
)
WHERE rn > 10;
-- MySQL、PostgreSQL 以及 SQLite
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
LIMIT 10 OFFSET 10;
LIMIT m OFFSET n
LIMIT n, m
原文作者:SQL编程思想;如有侵权,请联系管理员删除。