百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

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

mhr18 2024-10-11 12:43 17 浏览 0 评论

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

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

限定查询结果数量

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

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, salary
    FROM employee
    ORDER 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 rn
      FROM (
          SELECT emp_name, salary
          FROM employee
          ORDER 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

相关推荐

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

备份软件调用rman接口备份报错RMAN-06820 ORA-17629 ORA-17627

一、报错描述:备份归档报错无法连接主库进行归档,监听问题12541RMAN-06820:WARNING:failedtoarchivecurrentlogatprimarydatab...

增量备份修复物理备库gap(增量备份恢复数据库步骤)

适用场景:主备不同步,主库归档日志已删除且无备份.解决方案:主库增量备份修复dg备库中的gap.具体步骤:1、停止同步>alterdatabaserecovermanagedstand...

一分钟看懂,如何白嫖sql工具(白嫖数据库)

如何白嫖sql工具?1分钟看懂。今天分享一个免费的sql工具,毕竟现在比较火的NavicatDbeaverDatagrip都需要付费才能使用完整功能。幸亏今天有了这款SQLynx,它不仅支持国内外...

「开源资讯」数据管理与可视化分析平台,DataGear 1.6.1 发布

前言数据齿轮(DataGear)是一款数据库管理系统,使用Java语言开发,采用浏览器/服务器架构,以数据管理为核心功能,支持多种数据库。它的数据模型并不是原始的数据库表,而是融合了数据库表及表间关系...

您还在手工打造增删改查代码么,该神器带你脱离苦海

作为Java开发程序,日常开发中,都会使用Spring框架,完成日常的功能开发;在相关业务系统中,难免存在各种增删改查的接口需求开发。通常来说,实现增删改查有如下几个方式:纯手工打造,编写各种Cont...

Linux基础知识(linux基础知识点及答案)

系统目录结构/bin:命令和应用程序。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev:dev是Device(设备)的缩写,该目录...

PL/SQL 杂谈(二)(pl/sql developer使用)

承接(一)部分。我们从结构和功能这两个方面展示PL/SQL的关键要素。可以看看PL/SQL的优雅的代码。写出一个好的代码,就和文科生写出一篇优秀的作文一样,那么赏心悦目。1、与SQL的集成PL/S...

电商ERP系统哪个好用?(电商erp哪个好一点)

电商ERP系统哪个好用?做电商的,谁还没被ERP折腾过?有老板说:“我们早就上了ERP,订单、库存、财务全搞定,系统用得飞起。”也有运营吐槽:“系统是上了,可库存老不准,订单漏单错单天天有,财务对账还...

汽车检测线系统实例,看集中控制与PLC分布控制

PLC可编程控制器,上个世纪70年代初,为取代早期继电器控制线路,开始采取存储指令方式,完成顺序控制而设计的。开始仅有逻辑运算、计时、计数等简单功能。随着微处理的发展,PLC可编程能力日益提高,已经能...

苹果五件套成公司年会奖品主角,几大小技巧教你玩转苹果新品

钱江晚报·小时新闻记者张云山随着春节的临近,各家大公司的年会又将陆续上演。上周,各大游戏公司的年会大奖,苹果五件套又成了标配。在上海的游戏公司中,莉莉丝奖品列表拉得相当长,从特等奖到九等奖还包含了特...

取消回复欢迎 发表评论: