查询过滤、排序与分页:服务真实列表场景 真实的列表页几乎不会展示全表数据,而是「按条件筛选、按某字段排序、每页固定条数」。本节讲解如何用 WHERE、ORDER BY、LIMIT / OFFSET 实现这些需求,并介绍全文搜索与索引优化。 用 WHERE 过滤数据 WHERE 子句用于指定「只返回满足条件的行」,是查询中最常用的部分。 常用条件运算符: 比较运算符: 、 (不等于)、 、 、 、 逻辑组合: 、 、 范围: 集合: (属于某几个值之一) 模糊匹配: 、 (不区分大小写的模糊匹配) 空值判断: 、 是 PostgreSQL 特有的不区分大小写模糊匹配,对中文等无大小写语言也兼容良好,是前端搜索常用工具。
真实的列表页几乎不会展示全表数据,而是「按条件筛选、按某字段排序、每页固定条数」。本节讲解如何用 WHERE、ORDER BY、LIMIT / OFFSET 实现这些需求,并介绍全文搜索与索引优化。
WHERE 子句用于指定「只返回满足条件的行」,是查询中最常用的部分。
SELECT id, email, name FROM users WHERE status = 'active' AND created_at > '2026-01-01';
常用条件运算符:
=、<>(不等于)、>、<、>=、<=AND、OR、NOTBETWEEN a AND bIN ('a', 'b', 'c')(属于某几个值之一)LIKE、ILIKE(不区分大小写的模糊匹配)IS NULL、IS NOT NULL-- 查找昵称包含「张」且已激活的用户 SELECT id, name FROM users WHERE name ILIKE '%张%' AND status = 'active';
ILIKE是 PostgreSQL 特有的不区分大小写模糊匹配,对中文等无大小写语言也兼容良好,是前端搜索常用工具。
ORDER BY 指定结果按哪些列、以什么顺序排列。
SELECT id, name, created_at FROM users ORDER BY created_at DESC LIMIT 10;
要点:
ASC(升序,默认)、DESC(降序)。当结果可能很多时,不能一次性返回全部,需要分页。最基础的分页用 LIMIT(每页条数)配合 OFFSET(跳过多少条)。
-- 每页 20 条,取第 3 页 SELECT id, title FROM posts ORDER BY created_at DESC LIMIT 20 OFFSET 40;
OFFSET 分页简单直观,但在「页码很深」时性能会下降,因为数据库仍需扫描并跳过前 N 条。对深层分页,更推荐游标分页(keyset pagination):记住上一页最后一条的排序值,下一页从该值之后取。
-- 游标分页:已知上一页最后一篇的 created_at 与 id SELECT id, title, created_at FROM posts WHERE (created_at, id) < ('上一页时间', '上一页ID') ORDER BY created_at DESC, id DESC LIMIT 20;
游标分页在大数据量、无限滚动场景下明显优于 OFFSET。
LIKE / ILIKE 适合简单的子串匹配,但面对「按相关性排序、支持多词、支持中文分词」的真正搜索需求时显得力不从心。PostgreSQL 提供内置的全文搜索能力:
全文搜索的完整用法较复杂,本节只建立概念认知。在文档量极大或需要语义级搜索时,还可进一步结合第 9 章的向量检索。
没有索引时,数据库要逐行扫描整张表来满足 WHERE 条件——数据量大时极慢。索引是一种加速查询的数据结构,类似书的目录,让数据库能快速定位到符合条件的行。
索引的几个关键点:
常见索引类型:
判断查询为何慢,可用
EXPLAIN查看数据库的执行计划,看它是否走了索引、扫描了多少行。这是 SQL 性能调优的核心工具。
SELECT *。WHERE 过滤、ORDER BY 排序、LIMIT / OFFSET(或游标)分页,是支撑真实列表与搜索场景的三件套;全文搜索与索引则决定了查询能力的天花板与性能。把这些用熟,你的查询就能既灵活又高效。下一节进入关系型数据库的精华——多表联结与聚合统计。