首页 > 数据库 >PostgreSQL 限定结果数量

PostgreSQL 限定结果数量

时间:2023-07-13 20:37:00浏览次数:31  
标签:salary 10 PostgreSQL name 限定 FETCH LIMIT OFFSET 数量

查询语句的结果可能包含成百上千行数据,但是前端显示时也许只需要其中的小部分,例如TOP-N排行榜;或者为了便于查看,每次只显示一定数量的结果,例如分页功能。为了处理这类应用,SQL提供了标准的FETCH和OFFSET子句。另外,PostgreSQL还实现了扩展的LIMIT语法。

Top-N查询

这类查询通常是为了找出排名中的前N个记录,例如以下语句查询薪水最高的前10名员工,使用FETCH语法:

SELECT first_name,last_name,salary FROM employees order by salary desc  fetch first 10 rows only 

其中,FIRST也可以写成NEXT,ROWS也可以写成ROW。结果返回了排序之后的前10条记录。使用LIMIT语法也可以实现相同的功能:

SELECT first_name,last_name,salary FROM employees order by salary desc limit 10;

分页查询

许多应用都支持分页显示的功能,即每页显示一定数量的记录(例如10行、20行等),同时提供类似上一页和下一页的导航。使用SQL实现这种功能需要引入另一个子句:OFFSET。假设我们的应用提供了分页显示,每页显示10条记录。现在用户点击了下一页,需要显示第11到第20条记录。使用标准SQL语法实现如下:
SELECT first_name,last_name,salary FROM employees order by salary desc OFFSET 10 ROWS fetch first 10 rows only ;

OFFSET表示先忽略掉多少行数据,然后再返回后面的结果。ROWS也可以写成ROW。对于应用程序而言,只需要传入不同的OFFSET偏移量和FETCH数量,就可以在结果中任意导航。使用LIMIT加上OFFSET同样可以实现分页效果:

SELECT first_name,last_name,salary FROM employees order by salary desc limit 10 offset 10;

注意事项

先看一下完整的FETCH和LIMIT语法:

SELECT column1, column2, ...FROM table[WHERE conditions][ORDER BY column1 ASC, column2 DESC, ...][OFFSET m {ROW | ROWS}][FETCH { FIRST | NEXT } [ num_rows] { ROW | ROWS }  ONLY];
SELECT column1, column2, ...FROM table[WHERE conditions][ORDER BY column1 ASC, column2 DESC, ...][LIMIT { num_rows| ALL } ][OFFSET m {ROW | ROWS}];

在使用以上功能时需要注意以下问题

  • FETCH是标准SQL语法,LIMIT是PostgreSQL扩展语法。
  • 如果没有指定ORDER BY,限定数量之前并没有进行排序,是一个随意的结果。
  • OFFSET偏移量必须为0或者正整数。默认为0,NULL等价于0。
  • FETCH限定的数量必须为0或者正整数。默认为1,NULL等价于不限定数量。
  • LIMIT限定的数量必须为0或者正整数,没有默认值。ALL或者NULL表示不限定数量。
  • 随着OFFSET的增加,查询的性能会越来越差。因为服务器需要计算更多的偏移量,即使这些数据不需要被返回前端。

标签:salary,10,PostgreSQL,name,限定,FETCH,LIMIT,OFFSET,数量
From: https://www.cnblogs.com/wdh01/p/17233372.html

相关文章

  • Postgresql统计所有表的基本信息(如行数、大小等)
    pg_class目录pg_class记录表和几乎所有具有列或者像表的东西。这包括索引(但还要参见pg_index)、序列、视图、物化视图、组合类型和TOAST表。pg_class中的一些逻辑标志被以一种懒惰的方式维护:在正确状态时它们被保证为真,但是当条件不再为真时它们并不会被立刻重置为假。例如......
  • PHP 生成数据库的 markdown 字段说明文档,支持 mysql,postgresql
    安装composerrequirepeng49/db2markdown命令行使用phpvendor/bin/db2markdown输入数据库的地址(host),端口(port)用户名,密码,要导出的表,默认是*,生成所有表的文档,指定多个表明用逗号隔开,如:table1,table2$phpsrc/bin/db2markdownpleaseenterthedb(1mys......
  • PostgreSQL在线修改数据类型
    修改大表中列的数据类型几乎总是一件痛苦的事情。由于altertable语句获得的排他锁,它可能会锁定整个表的读写。本文中,我们将探讨如何以最小的影响、最少的锁来执行这样的操作。它适用于任何数据类型;让我们以int到bigint的变化为例。 示范用例假设我们有一个有许多列的表。其......
  • PostgreSQL(pg) /MYSQL数据库,使用递归查询(WITH RECURSIVE)功能来实现获取指定菜单ID的
      PostgreSQL/MYSQL数据库,使用递归查询(WITHRECURSIVE)功能来实现获取指定菜单ID的所有下级菜单数据。下方用例是假设菜单表menu的改成自己的表即可WITHRECURSIVEmenu_hierarchyAS(SELECTid,name,parent_idFROMmenuWHEREid=<指......
  • postgresql序列重复问题处理
    问题在执行数据插入时,postgresql提示morethanoneowned sequence found错误。这个和之前文章中写的序列编号错乱不同,是由数据表的一个列生成了多个序列导致的。(常见于两个数据库的拷贝、同步等操作)。如果查看序列,会发现序列中有很多重复的项目,可以执行语句:SELECT'DROPSE......
  • postgresql 统计表数据量并整理表
    selectt1.relnameas表名,pg_size_pretty(pg_relation_size(relid))as大小,(selectcast(reltuplesasINTEGER)frompg_classwhererelkind='r'andrelname=t1.relname)as记录数frompg_stat_user_tablesast1whereschemaname=......
  • 使用一行脚本将视频关键帧数量小于10的视频拷贝到文件夹
    假设文件夹input中有很多视频,视频的后缀为mpeg,将视频关键帧数量小于10的视频拷贝到文件夹ouput中foriininput/*.mpeg;doffprobe-select_streamsv-show_frames-vquiet-print_formatjson=compact=1$i|grep'"key_frame":1'|wc-l|(readcount&&[$count-lt......
  • 在matlab中用蒙特卡洛算法对电动汽车充电负荷进行模拟,可自己修改电动汽车数量,论文复现
    在matlab中用蒙特卡洛算法对电动汽车充电负荷进行模拟,可自己修改电动汽车数量,论文复现。参考论文:基于V2G的电动汽车充放电优化调度策略有注释简单易懂,可随意调整参数。YID:3710647182121327......
  • PostgreSQL-用户定义的函数
    PostgreSQL-用户定义的函数PostgreSQL是可扩展的,PostgreSQL服务器能够通过动态载入把用户编写的代码结合到自身中。也就是用户能够指定一个实现了新类型或函数的对象代码文件,并且PostgreSQL按要求载入它。主要讲的是查询语言函数与过程语言函数中的PL/pgSQL(SQL过程语言),其他......
  • 【《C++ Primer 第四版》读书笔记】4.2.5-指针和const限定符
    1.指向const对象的指针1.1表现形式constdouble*ptr,constvoid*ptr1.2如何理解无法通过ptr这个指针变量去修改所指向内存区域的值,但是ptr这种指针变量可以重复赋值,指向不同的内存地址注意ptr这个指针变量赋值时,既可以赋值为const类型变量(书中所说的const对象)的地址,也......