系列文章目录

SQL全方位攻略:1.数据库介绍
SQL全方位攻略:2.SQL介绍
SQL全方位攻略:3.SQL标准
SQL全方位攻略:4. 标准SQL和SQL“方言”


文章目录

  • 系列文章目录
  • SQL “方言”大比拼:Oracle、MySQL、PostgreSQL限制检索行数语法详解(分页查询)
    • 1. Oracle中使用ROWNUM或者ROW_NUMBER()函数实现限制检索行数和分页查询
      • 1. 使用ROWNUM实现分页查询
        • 语法1:随机获取表中的前n条数据
        • 语法2:按照某列排序,获取表中的前n条数据(Top-N)
        • 语法3:实现分页查询
      • 2. 使用ROW_NUMBER()实现分页查询
        • 语法1:获取表中的前n条数据
        • 语法2:实现分页查询
    • 2. MySQL使用LIMIT实现限制检索行数和分页查询
      • 语法1:获取表中的前n条数据
      • 语法2:LIMIT实现分页查询
      • 语法3:LIMIT和OFFSET实现分页查询(兼容PostgreSQL)
    • 3. PostgreSQL使用LIMIT和OFFSET实现限制检索行数和分页查询
      • 语法1:获取表中的前n条数据
      • 语法2:LIMIT和OFFSET实现分页查询
    • 总结

【免责声明】文章仅供学习交流,观点代表个人,与任何公司无关。
编辑|SQL和数据库技术(ID:SQLplusDB)


SQL “方言”大比拼:Oracle、MySQL、PostgreSQL限制检索行数语法详解(分页查询)

Oracle、MySQL和PostgreSQL等关系型数据库中基本都支持标准SQL,虽然SQL的基本语法在这些数据库中是类似的,但是在一些特定的功能和语法上仍然存在差异。

在MySQL和PostgreSQL中,可以使用LIMIT和OFFSET关键字来实现分页查询(限制SELECT语句返回结果行数)的操作,而Oracle中则需要使用ROWNUM或者ROW_NUMBER()函数实现。
它们的具体用法如下:

1. Oracle中使用ROWNUM或者ROW_NUMBER()函数实现限制检索行数和分页查询

在Oracle中,使用ROWNUM或者ROW_NUMBER()函数都可以实现分页查询,用于限制SELECT语句返回结果行数。具体操作如下:

1. 使用ROWNUM实现分页查询

ROWNUM是Oracle中一个伪列,用于表示返回结果集中的行数。通过使用ROWNUM和WHERE语句,可以实现分页查询的操作。

语法1:随机获取表中的前n条数据

SELECT *
FROM table_name
WHERE ROWNUM <= n;

语法2:按照某列排序,获取表中的前n条数据(Top-N)

SELECT *FROM (SELECT * FROM table_name ORDER BY table_column)WHERE ROWNUM < n;

语法3:实现分页查询

SELECT *
FROM (SELECT ROWNUM rn, t.* FROM (SELECT * FROM table_name WHERE conditions ORDER BY sort_key) t WHERE ROWNUM <= page_size * page_index
) t1
WHERE rn > page_size * (page_index - 1);

其中,page_size表示每页显示的记录数,page_index表示当前页数。这个查询语句中,先按照sort_key排序,然后取出前page_size * page_index个记录并加上ROWNUM,再通过WHERE语句过滤出第page_size * (page_index - 1) + 1到page_size * page_index行的记录。

2. 使用ROW_NUMBER()实现分页查询

ROW_NUMBER()函数是Oracle 9i及以上版本中引入的一个窗口函数,在排序后的结果中为每条记录分配一个序号。通过在SELECT语句中使用ROW_NUMBER()函数,并结合OVER子句和WHERE子句,也可以实现分页查询的操作,示例代码如下。

语法1:获取表中的前n条数据

SELECT *
FROM (SELECT ROW_NUMBER() OVER (ORDER BY column1, column2) AS rownum, column1, column2FROM table_name
)
WHERE rownum <= :page_size;

其中,table_name为要查询的表名,column1和column2为要排序的列名,:page_size为每页显示的记录数。

上述SQL语句中,ROW_NUMBER()函数会按照column1和column2两个列的升序排列,并为每一行数据分配一个唯一的序号(rownum)。然后通过WHERE子句限制查询结果只返回前page_size条记录,即每页显示的数据。

需要注意的是,ROW_NUMBER()函数只能用于查询语句中,不能直接用于更新语句中。如果需要在更新语句中对数据进行排序,则需要使用ORDER BY子句。

语法2:实现分页查询

SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY sort_key) rn, t.* FROM table_name t WHERE conditions
) WHERE rn > page_size * (page_index - 1) AND rn <= page_size * page_index;

SQL语句先按照sort_key排序,然后使用ROW_NUMBER()函数为每条记录分配一个序号,再通过WHERE语句过滤出第page_size * (page_index - 1) + 1到page_size * page_index行的记录。

总的来说,使用ROWNUM或者ROW_NUMBER()函数都可以实现Oracle中的分页查询,需要根据具体需求选择合适的语法。同时,需要注意在使用ROWNUM时要先排序再进行筛选,而使用ROW_NUMBER()则可以在OVER子句中指定排序方式。

参考:
ROWNUM Pseudocolumn
ROW_NUMBER

2. MySQL使用LIMIT实现限制检索行数和分页查询

MySQL中同样提供了限制检索行数语法,但是和Oracle不同使用LIMIT关键字。
在分页查询中,使用LIMIT还可以将结果集分成多个页面。

LIMIT {[offset,] row_count | row_count OFFSET offset}

语法1:获取表中的前n条数据

MySQL使用LIMIT关键字来限制返回结果集中的行数,语法如下:

SELECT *
FROM table_name
LIMIT n;

其中,n为希望返回行数的值。
例:

mysql> select count(*) from actor;
+----------+
| count(*) |
+----------+
|      200 |
+----------+
1 row in set (0.03 sec)mysql> select * from actor limit 10;
+----------+------------+--------------+---------------------+
| actor_id | first_name | last_name    | last_update         |
+----------+------------+--------------+---------------------+
|        1 | PENELOPE   | GUINESS      | 2006-02-15 04:34:33 |
|        2 | NICK       | WAHLBERG     | 2006-02-15 04:34:33 |
|        3 | ED         | CHASE        | 2006-02-15 04:34:33 |
|        4 | JENNIFER   | DAVIS        | 2006-02-15 04:34:33 |
|        5 | JOHNNY     | LOLLOBRIGIDA | 2006-02-15 04:34:33 |
|        6 | BETTE      | NICHOLSON    | 2006-02-15 04:34:33 |
|        7 | GRACE      | MOSTEL       | 2006-02-15 04:34:33 |
|        8 | MATTHEW    | JOHANSSON    | 2006-02-15 04:34:33 |
|        9 | JOE        | SWANK        | 2006-02-15 04:34:33 |
|       10 | CHRISTIAN  | GABLE        | 2006-02-15 04:34:33 |
+----------+------------+--------------+---------------------+
10 rows in set (0.00 sec)

语法2:LIMIT实现分页查询

为了实现分页查询,需要限制结果集中的行数同时还要跳过一定的行数,使用LIMIT可以将结果集分成多个页面,下面是LIMIT语法的详细说明:

SELECT *
FROM table_name
LIMIT offset, row_count;

语法说明:

  • offset表示查询结果的起始位置,即跳过多少条记录,取下一条记录作为返回记录。
  • row_count表示要返回的记录数,也就是取几条记录。例:如果row_count为5,表示返回5条记录。
  • 如果只给出LIMIT row_count,则默认offset为0,从第1条记录开始返回row_count条记录,即LIMIT row_count 等于 LIMIT 0, row_count。
  • 如果查询结果不足指定的row_count条记录,则返回实际可用的记录数。

例:查询第2到12条记录

mysql> select * from actor limit 2,10;
+----------+------------+--------------+---------------------+
| actor_id | first_name | last_name    | last_update         |
+----------+------------+--------------+---------------------+
|        3 | ED         | CHASE        | 2006-02-15 04:34:33 |
|        4 | JENNIFER   | DAVIS        | 2006-02-15 04:34:33 |
|        5 | JOHNNY     | LOLLOBRIGIDA | 2006-02-15 04:34:33 |
|        6 | BETTE      | NICHOLSON    | 2006-02-15 04:34:33 |
|        7 | GRACE      | MOSTEL       | 2006-02-15 04:34:33 |
|        8 | MATTHEW    | JOHANSSON    | 2006-02-15 04:34:33 |
|        9 | JOE        | SWANK        | 2006-02-15 04:34:33 |
|       10 | CHRISTIAN  | GABLE        | 2006-02-15 04:34:33 |
|       11 | ZERO       | CAGE         | 2006-02-15 04:34:33 |
|       12 | KARL       | BERRY        | 2006-02-15 04:34:33 |
+----------+------------+--------------+---------------------+
10 rows in set (0.00 sec)mysql>

语法3:LIMIT和OFFSET实现分页查询(兼容PostgreSQL)

为了兼容PostgreSQL,MySQL也支持LIMIT row_count OFFSET offset语法。
可以使用LIMIT和OFFSET关键字,语法如下:

SELECT *
FROM table_name
LIMIT n OFFSET m;

其中,n为希望返回的行数,m为需要跳过的行数。

对于上面的【查询第2到12条记录】的例子,还可以用LIMIT row_count OFFSET offset语法实现。
例:

mysql> select * from actor limit 10 OFFSET 2;
+----------+------------+--------------+---------------------+
| actor_id | first_name | last_name    | last_update         |
+----------+------------+--------------+---------------------+
|        3 | ED         | CHASE        | 2006-02-15 04:34:33 |
|        4 | JENNIFER   | DAVIS        | 2006-02-15 04:34:33 |
|        5 | JOHNNY     | LOLLOBRIGIDA | 2006-02-15 04:34:33 |
|        6 | BETTE      | NICHOLSON    | 2006-02-15 04:34:33 |
|        7 | GRACE      | MOSTEL       | 2006-02-15 04:34:33 |
|        8 | MATTHEW    | JOHANSSON    | 2006-02-15 04:34:33 |
|        9 | JOE        | SWANK        | 2006-02-15 04:34:33 |
|       10 | CHRISTIAN  | GABLE        | 2006-02-15 04:34:33 |
|       11 | ZERO       | CAGE         | 2006-02-15 04:34:33 |
|       12 | KARL       | BERRY        | 2006-02-15 04:34:33 |
+----------+------------+--------------+---------------------+
10 rows in set (0.00 sec)mysql>

参考:

https://dev.mysql.com/doc/refman/8.0/en/select.html

3. PostgreSQL使用LIMIT和OFFSET实现限制检索行数和分页查询

在 PostgreSQL 中,可以使用 LIMITOFFSET 子句来限制检索的行数和进行分页查询。

SELECT select_list
FROM table_expression
[ ORDER BY … ]
[ LIMIT { number | ALL } ] [ OFFSET number ]

语法说明:

  • SELECT select_list:从数据库中选取列的列表。您可以指定一个或多个列,使用逗号分隔。如果要检索所有列的数据,也可以使用通配符 *
  • FROM table_expression:从数据库中选取数据的表名或视图。
  • ORDER BY:按升序或降序排列检索的数据。可以根据一个或多个列进行排序,如果没有指定 ORDER BY 子句,则检索出的数据将以任意顺序返回。
  • LIMIT { number | ALL }:限制要返回的记录数的数量。如果指定为数字,则表示要返回的记录数。如果设置为 ALL,则返回表中的所有记录。
  • OFFSET number:从查询的结果集的开头开始省略前 number 个记录。

语法1:获取表中的前n条数据

要限制要检索的行数,可以仅使用 LIMIT 子句。

SELECT * FROM table_name
LIMIT n;

在 PostgreSQL 的 SELECT 查询语句中,LIMIT 子句指定检索记录的最大数量。如果指定了 LIMIT 子句,将只返回指定数量的记录,即使实际情况下表中存在更多记录。但是,如果查询本身返回的行数少于 LIMIT 子句所指定的数量,则只会返回查询所产生的行数。

例如,假设执行如下查询:

SELECT * FROM my_table LIMIT 10;

如果 my_table 中只有 5 行,则只返回这 5 行,并且 LIMIT 子句将被保留。如果 my_table 中有 20 行,则只返回前 10 行。

语法2:LIMIT和OFFSET实现分页查询

要执行分页查询,需要同时使用 LIMITOFFSET 子句。
另外,在进行分页查询时,需要确保在表中有某种排序规则,以便在每次查询时都可以得到正确的结果。所以通常需要使用 ORDER BY 子句来指定表中的排序规则。

例如,下面是一个分页查询的示例:

-- 创建表 table1
CREATE TABLE table1 (id SERIAL PRIMARY KEY,name VARCHAR(50) NOT NULL,create_date TIMESTAMP NOT NULL
);-- 插入一些数据
INSERT INTO table1 (name, create_date) VALUES
('John', '2020-11-01 09:00:00'),
('Mary', '2020-11-02 10:00:00'),
('Tom', '2020-11-03 11:00:00'),
('Kate', '2020-11-04 12:00:00'),
('Bob', '2020-11-05 13:00:00'),
('Lisa', '2020-11-06 14:00:00'),
('Peter', '2020-11-07 15:00:00'),
('Alice', '2020-11-08 16:00:00'),
('David', '2020-11-09 17:00:00'),
('Jane', '2020-11-10 18:00:00'),
('Alex', '2020-11-11 19:00:00'),
('Sarah', '2020-11-12 20:00:00'),
('Mike', '2020-11-13 21:00:00'),
('Lucy', '2020-11-14 22:00:00');-- 运行查询
SELECT *
FROM table1
ORDER BY create_date
LIMIT 10
OFFSET 10;

执行结果输出例:

mydb1=# select * from table1;id | name  |     create_date
----+-------+---------------------1 | John  | 2020-11-01 09:00:002 | Mary  | 2020-11-02 10:00:003 | Tom   | 2020-11-03 11:00:004 | Kate  | 2020-11-04 12:00:005 | Bob   | 2020-11-05 13:00:006 | Lisa  | 2020-11-06 14:00:007 | Peter | 2020-11-07 15:00:008 | Alice | 2020-11-08 16:00:009 | David | 2020-11-09 17:00:0010 | Jane  | 2020-11-10 18:00:0011 | Alex  | 2020-11-11 19:00:0012 | Sarah | 2020-11-12 20:00:0013 | Mike  | 2020-11-13 21:00:0014 | Lucy  | 2020-11-14 22:00:00
(14 rows)mydb1=# SELECT *
mydb1-# FROM table1
mydb1-# ORDER BY create_date
mydb1-# LIMIT 10
mydb1-# OFFSET 10;id | name  |     create_date
----+-------+---------------------11 | Alex  | 2020-11-11 19:00:0012 | Sarah | 2020-11-12 20:00:0013 | Mike  | 2020-11-13 21:00:0014 | Lucy  | 2020-11-14 22:00:00
(4 rows)mydb1=#

在上面的示例中,我们创建了一个名为 table1 的表,并插入一些数据。然后,我们运行了与原始 SQL 语句相同的查询,检索满足条件的前10行,从第11行开始显示。
我们在 create_date 列上对表进行排序,并检索从第11行开始的10行记录。由于表中仅有14条数据,所以最终的输出为4条数据。

参考:

>7.6. LIMIT and OFFSET

https://www.postgresql.org/docs/14/sql-select.html
https://www.postgresql.org/docs/14/queries-limit.html

总结

本文我们介绍了 Oracle、MySQL 和 PostgreSQL 数据库实现限制检索行数(分页查询)的语法及其不同之处。

SQL全方位攻略:5. SQL “方言”大比拼:Oracle、MySQL、PostgreSQL限制检索行数语法详解(分页查询)相关推荐

  1. SQL全方位攻略:之数据库历史、数据库基本概念和相关术语,以及常见的数据库类型介绍

    文章目录 1.数据库介绍 1.1 数据库历史 1.2 数据库基本概念和术语 1.2.1. 数据库 1.2.2. 数据库管理系统(DBMS) 1.2.3. 应用程序 1.2.4. 模式(Schema) ...

  2. SQL全方位攻略:3.SQL标准

    系列文章目录 1.数据库介绍 2.SQL介绍 文章目录 系列文章目录 3. SQL标准 3.1 ISO SQL和ANSI SQL 3.2 SQL标准的历史 1. SQL-86 2. SQL-89 (S ...

  3. 学生如何快速申请软件著作权证书攻略,1个人和多个著作权人申请软著注意事项详解?

    软件著作权申请流程:准备软著申请电子材料 <=>中国版权保护中心官网实名认证 => 填写申请表 =>打印准备签字纸质材料 =>递交官方 =>官方受理 =>官方 ...

  4. CPU超频全方位攻略

    生动的入门经典!CPU超频全方位攻略! 本文主要介绍如何进行CPU超频,内容非常简单,而且细致,比较适合DIY初级爱好者.  现在一提起DIY,要是少了超频,就好像炒菜少了盐一样,索然无味了.超频中最 ...

  5. 计算机毕业设计Java峨眉山景点介绍及旅游攻略推荐平台(源码+系统+mysql数据库+lW文档)

    计算机毕业设计Java峨眉山景点介绍及旅游攻略推荐平台(源码+系统+mysql数据库+lW文档) 计算机毕业设计Java峨眉山景点介绍及旅游攻略推荐平台(源码+系统+mysql数据库+lW文档) 本源 ...

  6. SQL Server 2005 Express 远程连接 客户端 远程访问 设置 全攻略 (适用 SQL Server 2005 其他版本)

    SQL Server 2005 Express 是微软提供的数据库的低端解决方案, 可免费任意随产品分发, 可以在XP等非专业服务器系统下安装, 还可以远程访问, 对于小型数据应用程序已足够满足数据使 ...

  7. DVWA通过攻略之SQL注入

    目录 1.SQL Injection SQL注入 2.实验演示 2.1.low 2.3.high 2.4.impossible 3.sqlmap自动化注入 3.1.low 3.2.medium 3.3 ...

  8. 我的世界虚拟人生可以在服务器玩吗,我的世界虚拟人生全方位攻略 虚拟人生玩法介绍...

    以下就是小编我为大家准备的一些资料,希望对大家有所帮助,我的世界虚拟人生mod可以让游戏中的村庄和村民变得像电脑游戏模拟人生那样,玩家可以在村庄里进行各种与现实生活类似的活动,并且还可以与村民进行更为 ...

  9. mysql优化的几种方法_详解mysql数据库不同类型sql语句优化方法

    概述 分享一下之前笔记记录的一些不同类型sql语句优化方法,针对mysql. 主要分成优化INSERT语句.优化ORDER BY语句.优化GROUP BY 语句.优化嵌套查询.优化OR语句这几个方面, ...

最新文章

  1. 回击质疑 HP StoreOnce用高性能说话
  2. 爆火的博士论文致谢,“炸”出了一批同行者,刚刚本人回应:祝愿大家努力终有所成!...
  3. 100个短缺职业排行榜出炉 找工作,这些职业最缺人
  4. 深入理解Linux IO复用之epoll
  5. 博客转移至 https://www.babac.cn/
  6. 记一次kafka集群频繁crash的排查过程
  7. python2.7更新_centos系统python2.7更新到3.5
  8. CDOJ 796 DAGE(Big Brother)
  9. C++ opencv视频处理与保存
  10. 雷电模拟器连接android studio教程
  11. 桌面移到D盘根目录下还原的办法
  12. 正则表达式的语法规则及使用
  13. 学生护眼台灯aa和a的区别?分享适合学生的护眼台灯
  14. 5、微信小程序-网络请求和本地存储
  15. 水溶性/油溶性四氧化三铁(Fe3O4)纳米颗粒
  16. 重大问题,Windows11出现重大BUG(开始菜单掉帧,卡顿)
  17. 【计算机组成原理】计算机组成原理纠错本
  18. mcrypt php 加密解密,mcrypt启用 加密以及解密过程详细解析
  19. ArcGIS中克里金插值操作
  20. MT6735平台UART打印问题

热门文章

  1. CSS 的“层”峦“叠”翠 - 一文掌握z-index用法​​​​​​​
  2. Codeforces 219E Parking Lot 线段树
  3. vim配置及插件安装管理(超级详细)
  4. 计算机办公软件知识考试试题,office办公软件考试题「附答案」
  5. 洛谷P5119 Convent 题解
  6. 【报告分享】深流时代-2021腾讯娱乐白皮书-腾讯新闻(附下载)
  7. 云原生、产业互联网、低代码、Web3、元宇宙……哪个是2022年架构热点?
  8. NOJ-求广义表的深度(C语言描述)
  9. linux中systemctl命令理解以及.service文件参数解析
  10. 这个屏下指纹解锁,为什么这么快?