Préface
1. Pagination SQL
- Logique : 10 éléments par page, prenez la page 3. Autrement dit, prenez les données du 21 au 30
1.1. MySQL
/ SQLite
/PostgreSQL
select * from demo limit 10 offset 20;
select * from demo limit 20, 10; -- PostgreSQL不支持该写法
1.2.Oracle12C+
-
Oracle11g était difficile à utiliser auparavant. Oracle12C+ a le même format d'utilisation que MySQL, mais les mots-clés de syntaxe sont différents et plus verbeux.
-
grammaire
- OFFSET est un décalage, une constante, par défaut à 0 s'il n'est pas écrit et est souvent utilisé pour la pagination.
- FETCH NEXT 1 ROWS équivaut à FETCH FIRST 1 ROW.
- Only renvoie uniquement le montant spécifié, avec des liens renvoie les mêmes données que les dernières données.
[OFFSET offset ROWS] FETCH NEXT [ row_count | percent PERCENT ] ROWS [ ONLY | WITH TIES ]
select * from demo offset 20 rows fetch next 10 rows only;
select * from demo fetch next 10 rows only;
1.3.Avant Oracle11g
_
- La première méthode d’écriture a des performances plus élevées que la deuxième méthode d’écriture. Pour plus de détails, voir https://blog.csdn.net/blood_Z/article/details/123524415
1.3.1. Première méthode d'écriture standard (haute performance)
-- 套2层,这样可以不影响原始sql
select * from -- 套第2层,用rownum分页
(
select rownum as rn, tmp.* from -- 套第1层,获取rownum。注意rownum必须起别名,因为rownum本质实时生成的
( select * from demo ) tmp -- 原始sql
where rownum <= 30
)
where rn > 20;
1.3.2. Méthode d'écriture standard 2 (faibles performances)
select * from -- 套第2层,用rownum分页
(
select rownum as rn, tmp.* from -- 套第1层,获取rownum。注意rownum必须起别名,因为rownum本质实时生成的
( select * from demo ) tmp -- 原始sql
)
where rn <= 30 and rn > 20;
1.3.3. Prendre les n premières méthodes d'écriture simplifiées
select * from demo where rownum <= 10;
1.3.4. Mauvaise écriture
- Aucune donnée n'a été trouvée. Pour plus de détails, voir https://blog.csdn.net/wangmx1993328/article/details/90664207 .
-- 注意:如下所示是错误的,不会查到记录。因为 rownum 是从1开始,永远不会大于2,where 条件永不成立,因为没有结果查询出来,所以 rownum 也不能加一,永远是1
select * from demo where rownum > 10;
select * from demo where rownum = 10;
select * from demo where rownum >= 10;
-- 原理同上,不等于10,只能取到前9条记录
select * from demo where rownum != 10;