五种主流数据库:排行榜与分页查询

默认情况下,查询语句会返回满足过滤条件的所有数据。但是,有些时候我们只需查看其中的部分结果,常见的这类应用场景包括 Top-N 排行榜和数据分页查询。

本文比较五种主流数据库限定查询结果数量的实现和差异,包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。

限定查询结果数量MySQLOracleSQL ServerPostgreSQLSQLite
Top排行榜LIMITFETCH、ROWNUMFETCH OFFSET、TOPFETCH、LIMITLIMIT
分页查询LIMIT OFFSETFETCH OFFSET、ROWNUMFETCH OFFSETFETCH OFFSET、LIMIT OFFSETLIMIT OFFSET

Top 排行榜

我们经常会看到各种 Top 排行榜,例如销量排行榜、十大热门游戏等。Top 排行榜的原理就是先对数据进行排序,然后返回前 N 条记录。SQL 标准定义了 FETCH 和 OFFSET 子句,可以用于限制返回结果的数量。例如,以下语句查找月薪排名前 5 的员工:

-- Oracle、Microsoft SQL Server 以及 PostgreSQL
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
OFFSET 0 ROWS
FETCH FIRST 5 ROWS ONLY;

其中,ORDER BY 子句表示按照月薪从高到低进行排序,OFFSET 子句表示跳过 0 行记录,FETCH 子句表示获取前 5 条记录,也就是月薪为 Top-5 的员工。查询返回的结果如下:

emp_name|salary 
--------|--------
刘备    |30000.00
关羽    |26000.00
张飞    |24000.00
诸葛亮  |24000.00
赵云    |15000.00

目前只有 Oracle、Microsoft SQL Server 以及 PostgreSQL 支持这种标准语法。其中 Oracle 和 PostgreSQL 中的 OFFSET 子句可以省略,默认表示跳过 0 行记录。

除标准 SQL 外,还有一种常见的 LIMIT 子句也可以实现相同的功能,例如:

-- MySQL、PostgreSQL 以及 SQLite
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
LIMIT 5 OFFSET 0;

其中,ORDER BY 子句表示按照月薪从高到低进行排序,OFFSET 子句表示跳过 0 行记录,LIMIT 子句表示获取前 5 条记录,也就是月薪为 Top-5 的员工。MySQL、PostgreSQL 以及 SQLite 实现了这种 LIMIT 语法。另外,OFFSET 子句可以省略,默认表示跳过 0 行记录。

如果使用 Oracle 数据库,也可以利用 ROWNUM 伪列获取月薪最高的 5 名员工:

-- Oracle
SELECT * 
FROM (SELECT emp_name, salaryFROM employeeORDER BY salary DESC)
WHERE rownum <= 5;

ROWNUM 伪列的作用就是对查询结果进行编号,序号从 1 开始递增。

如果使用 Microsoft SQL Server,我们也可以利用 TOP 关键字实现相同的功能。例如:

-- Microsoft SQL Server
SELECT TOP(5) emp_name, salary
FROM employee
ORDER BY salary DESC;

其中,ORDER BY 子句表示按照月薪从高到低进行排序,TOP(5) 表示返回前 5 条记录。

分页查询

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

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

-- Oracle、Microsoft SQL Server 以及 PostgreSQL
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
OFFSET 10 ROWS
FETCH FIRST 10 ROWS ONLY;

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

emp_name|salary 
--------|-------
关兴    |7000.00
关平    |6800.00
赵氏    |6600.00
...
简雍    |4800.00
孙乾    |4700.00

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

[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 12c 以上版本完全支持 n PERCENT 和 WITH TIES 选项。例如:

-- Oracle
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
FETCH FIRST 10 PERCENT ROWS ONLY;

查询返回的结果如下:

EMP_NAME|SALARY
--------|------
刘备    | 30000
关羽    | 26000
张飞    | 24000

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

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

-- 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

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

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

-- 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 提供的 TOP 子句也支持 PERCENT 以及 WITH TIES 选项。例如:

-- 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 数据库,如果使用 ROWNUM 伪列实现分页查询,需要嵌套两次子查询:

-- Oracle
SELECT *
FROM (SELECT emp_name, salary, rownum rnFROM (SELECT emp_name, salaryFROM employeeORDER BY salary DESC)WHERE rownum <= 20)
WHERE rn > 10;

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

-- MySQL、PostgreSQL 以及 SQLite
SELECT emp_name, salary
FROM employee
ORDER BY salary DESC
LIMIT 10 OFFSET 10;

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

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

LIMIT m OFFSET n
LIMIT n, m

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问题:金属电化学反应的实质是氧化还原反应,被腐蚀金属发生还原反应( ) #知识分享#知识分享#媒体

问题&#xff1a;金属电化学反应的实质是氧化还原反应&#xff0c;被腐蚀金属发生还原反应(  ) A、正确 B、错误 参考答案如图所示

Ainx框架实现 一

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于Ainx系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列…

Powershell Install 一键部署Prometheus

前言 Prometheus是一个开源的系统监控和报警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF托管的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,同时也支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上…

计算机毕业设计 | vue+SpringBoot图书借阅管理系统(附源码)

1&#xff0c; 概述 1.1 课题背景 随着现在科学技术的进步&#xff0c;人类社会正逐渐走向信息化&#xff0c;图书馆拥有丰富的文献信息资源&#xff0c;是社会系统的重要组成部分&#xff0c;在信息社会中作用越来越重要&#xff0c;在我国图书馆计算机等 信息技术的应用起步…

docker安装-centos

Docker CE 支持 64 位版本 CentOS 7&#xff0c;并且要求内核版本不低于 3.10 卸载旧版本Docker sudo yum remove docker \ docker-common \ docker-selinux \ docker-engine使用yum安装 yum 更新到最新版本: sudo yum update执行以下命令安装依赖包&#xff1a; sudo yum…

PyTorch 2.2 中文官方教程(十五)

&#xff08;beta&#xff09;计算机视觉的量化迁移学习教程 原文&#xff1a;pytorch.org/tutorials/intermediate/quantized_transfer_learning_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 提示 为了充分利用本教程&#xff0c;我们建议使用这个C…

算法刷题day05

目录 引言一、连号区间二、递增三元组三、特别数的和四、错误票据五、回文日期六、归并排序七、总结 引言 这些题其实之前是已经写过了的&#xff0c;但还是会有一些问题&#xff0c;比如说思路不清楚了&#xff0c;细节没有处理好&#xff0c;模板没有记熟都是问题&#xff0…

vue中使用html2canvas配合jspdf导出pdf(以及在导出时遇到的导出样式问题)

指定页面中导出为pdf格式并打包&#xff0c;使用html2canvas先转为图片格式&#xff0c;在利用jspdf转为pdf&#xff0c;最后下载打包为本地压缩包 yarn add html2canvas yarn add jspdf1. 注册一个插件并挂载 import html2Canvas from html2canvas import JsPDF from jspdf …

记一次生产系统每隔10小时(36000000毫秒)固定进行一次Full GC排查思路

一、 背景描述 某个应用在生产环境通过系统监控发现&#xff0c;应用每隔10小时就会触发一次Full GC&#xff0c;该系统当时承接的业务量并不大&#xff0c;而且固定10小时就会进行Full GC&#xff0c;通过监控时间轴发现Full GC频率很规律&#xff0c;直觉告诉我这不是JVM自身…

js实现根据字符串生成颜色

在JavaScript中&#xff0c;你可以根据给定的字符串生成一种颜色。这种操作通常需要将字符串转换为颜色代码&#xff0c;如十六进制颜色代码。下面是一个简单的示例&#xff0c;我们使用字符串的字符码来生成颜色&#xff1a; function stringToColor(str) {let hash 0;for (…

寒假 day1

1、请简述栈区和堆区的区别? 2、有一个整形数组:int arr[](数组的值由外部输入决定)&#xff0c;一个整型变量: x(也 由外部输入决定)。要求: 1)删除数组中与x的值相等的元素 2)不得创建新的数组 3)最多只允许使用单层循环 4)无需考虑超出新数组长度后面的元素&#xff0c;所以…

nginx请求头处理

不啰嗦,直接上代码 删除Content-Type #清理Content-Type types {}设置默认的content-type default_type application/wasm; 添加请求头 add_header header_name header_value; 隐藏请求头 proxy_hide_header heade_name;

使用PyMysql模块连接mysql

PyMysql模块的安装 在命令行窗口下执行下行命令即可 linux:sudo pip3 install PyMySQL windows: pip3 install PyMysql 连接数据库并查询数据 # 导入模块 import pymysql# 与数据库建立连接 my_db pymysql.connect(host"127.0.0.1", user"root", pas…

Authentication Persistence and Session Management

翻译版本 【spring-security 6.2.1 】session-managemen Authentication Persistence and Session Management 一旦您获得了一个正在对请求进行身份验证的应用程序&#xff0c;就必须考虑如何在未来的请求中持久化和恢复所产生的身份验证。 默认情况下&#xff0c;这是自动完…

网络原理TCP/IP(4)

文章目录 面向字节流粘包问题异常情况TCP小结 面向字节流 创建⼀个TCP的socket,同时在内核中创建⼀个发送缓冲区和⼀个接收缓冲区; • 调⽤write时,数据会先写⼊发送缓冲区中; • 如果发送的字节数太⻓,会被拆分成多个TCP的数据包发出; • 如果发送的字节数太短,就会先在缓…

【lesson40】理解文件系统

文章目录 问题磁盘结构&#xff08;物理&#xff09;磁盘的存储结构磁盘的抽象结构 问题 1.有没有没有被打开的文件&#xff1f;当然有 在哪里呢&#xff1f;磁盘中也叫磁盘级文件 2.学习磁盘级别文件的侧重点在哪&#xff1f; 站在单个文件角度: 这个文件在哪里&#xff1f…

【Linux】权限管理

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一 、Linux中的用户1.1 Linux用户分类1.2 用户转换1.3 指令提权 二、Linux权限管…

LeetCode:88. 合并两个有序数组(双指针 Java)

目录 88. 合并两个有序数组 题目描述&#xff1a; 实现代码与解析&#xff1a; 双指针 原理思路&#xff1a; 88. 合并两个有序数组 题目描述&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 num…

vscode git stash apply stash@{1}不生效

解决办法 在stash{1}前后加上引号 git stash apply “stash{1}“即可成功恢复指定的stash

企业网络采用SD-WAN的优势

近年来&#xff0c;SD-WAN成为企业网络领域的一项热门技术&#xff0c;为传统网络带来了新的变革。SD-WAN&#xff08;Software Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;以其灵活性、可管理性和低成本而备受青睐。它不仅能够创建成熟的专用网络&#…