PostgreSQL - PostgreSQL 反向查询策略(使用 ORDER BY、使用游标、使用窗口函数、使用 LIMIT 与 OFFSET 组合)

概述

  • PostgreSQL 反向查询,指的从尾开始查询,即按照与默认顺序相反的顺序查询

一、使用 ORDER BY

  1. 反向查询所有数据
SELECT * FROM 【表名】 ORDER BY id DESC;
  1. 反向查询 1 条数据
SELECT * FROM 【表名】 ORDER BY id DESC LIMIT 1;

二、使用游标

1、具体实现
BEGIN;
DECLARE reverse_cursor SCROLL CURSOR FOR SELECT * FROM 【表名】 ORDER BY id;
MOVE LAST IN reverse_cursor;
FETCH BACKWARD 5 FROM reverse_cursor;
COMMIT;
2、解读
  1. BEGIN;:开始一个事务块,游标操作需要在事务中执行

  2. DECLARE reverse_cursor SCROLL CURSOR FOR SELECT * FROM 【表名】 ORDER BY id;:声明一个名为 reverse_cursor 的可滚动游标

  3. 其中,SCROLL 是表示游标可以向前 / 向后移动,SELECT * FROM 【表名】 ORDER BY id; 是游标关联的查询

  4. MOVE LAST IN reverse_cursor;:将游标直接定位到查询结果的最后一条数据

  5. FETCH BACKWARD 5 FROM reverse_cursor;:从当前位置开始(最后一条数据),反向获取 5 条数据

  6. COMMIT;:提交事务,释放游标资源


三、使用窗口函数

1、具体实现
  1. 反向查询所有数据
SELECT * FROM (
  SELECT *, row_number() OVER (ORDER BY id DESC) as rn 
  FROM 【表名】
) t ORDER BY rn;
  1. 反向查询 3 条数据
SELECT * FROM (
  SELECT *, row_number() OVER (ORDER BY id DESC) as rn 
  FROM 【表名】
) t ORDER BY rn LIMIT 3;
2、解读
  1. row_number():窗口函数,为每一行分配一个唯一的序号

  2. OVER (ORDER BY id DESC):指定窗口函数的排序规则

  3. as rn:将生成的序号列命名为 rn

  4. SELECT * FROM (...) t ORDER BY rn;:从子查询结果中选择所有列,按 rn 升序排序


四、使用 LIMIT 与 OFFSET 组合

1、具体实现
SELECT * FROM 【表名】
ORDER BY id
LIMIT 5 OFFSET (SELECT count(*) FROM 【表名】) - 5;
2、解读
  1. SELECT * FROM 【表名】 ORDER BY id:从数据表中选择所有列,按 id 升序排列

  2. (SELECT count(*) FROM 【表名】):先计算表中总行数

  3. 【总行数】 - 5:计算偏移量,例如,数据表有 100 行,则偏移量为 95

  4. LIMIT 5 OFFSET 【偏移量】:限制返回 5 条记录

你可能感兴趣的:(数据库,postgresql,数据库,后端,mybatis,java-ee,java,intellij-idea)