当真
你会写 SQL。SELECT、JOIN、GROUP BY 都不在话下,MySQL 也用了好几年。可要说 PostgreSQL 到底哪里不一样,你大概只能答出「听说它更强大」。
这本书的答案,是两个字:当真。你给 MySQL 一个不存在的日期 '2026-02-30',它悄悄存成 0000-00-00;一个超长字符串,它悄悄截断;一句非法整数,它悄悄取 0。它把你的错误吞下去,若无其事。PostgreSQL 只有一种脾气:不合规,就当场拒绝,整个事务一起回滚。类型当真、约束当真、事务当真——甚至连你写的那句 SELECT 它都当真,认认真真替你估算成本、挑出最省的执行路径。
全书围着这两个字转。而且它是活的:书里两台招牌引擎——一台查询计划器、一台 MVCC 事务模拟器——是用 JavaScript 真写出来、就在这个网页里跑的。你换个 WHERE,亲眼看 planner 从顺扫改走索引;你交错两个事务,亲眼看一行数据裂成两个版本、各自被谁看见。正文里每个成本、每个行数,都是这台引擎当场算的。
这本书为什么不从「什么是 SELECT」讲起
因为你已经会了。你能写多表 JOIN,用过 GROUP BY,知道加索引能变快。市面上的 SQL 入门教程对你是浪费时间。你缺的不是「SQL 语法」,是两样别的东西:
- 把你会的那些 SQL 往深里再挖一层——为什么
NULL = NULL不是真、GROUP BY到底把数据切成了什么、窗口函数凭什么「不塌行」、递归查询怎么把一棵树展开。这些你天天在用,却未必说得清。 - 认识 PostgreSQL 这个你没真正打过交道的世界——它的类型系统、它对约束的较真、它那套反直觉的 MVCC 并发、它那个会自己找最优路径的查询规划器。这些正是它和 MySQL 分道扬镳的地方。
这两样,被一根主线串起来,就是「当真」。
很多人把数据库当成一个「桶」——把行丢进去,需要时捞出来。MySQL 的默认脾气纵容了这种想法:你丢什么它大都收下,实在不行就悄悄改一改。方便,但你的数据里从此埋着你不知道的地雷。
PostgreSQL 把数据库当成一台「引擎」,一台对正确性较真的引擎。它认真对待你声明的每一件事:这一列是 integer 就必须是整数,这一列 NOT NULL 就绝不许空,这笔转账要么全成要么全不成,你这句查询它会认真估算十几条可能的执行路径再挑最省的。读完这本书,你会永久地改变「看数据库」这件事——它不再是个桶,而是一个你能信任、也值得信任的伙伴。
「两台引擎在浏览器里跑」是什么意思
别的数据库教程讲 EXPLAIN,是把一段执行计划印在纸上让你看;讲 MVCC,是画一张静态示意图。这本书不一样:查询计划器和 MVCC 是用 JavaScript 真写出来的,就嵌在网页里。所以每一章的 Demo 都不是动画:
- 在计划器那章,你把
WHERE customer_id = 42改成> 42,它当场重新估算成本,从 Index Scan 翻脸改用 Seq Scan——因为命中的行太多了,用索引反而更贵,而它算得出来; - 在 MVCC 那章,你一步步交错两个事务,看同一行数据裂成两个版本(旧的打上
xmax、新的带上xmin),再看每个事务的快照各自「该看见哪个版本」; - 在三值逻辑那章,你随便给
a、b挑TRUE/FALSE/NULL,它算出真正的三值结果,顺手复现那个「NOT IN里混进 NULL 就一行都查不到」的线上事故。
正文里出现的每一个数字(这个查询估算成本 2188、那五种 JOIN 分别是 3 / 5 / 4 / 6 / 16 行、running SUM 累加成 45→123→148→187→322),都是这些引擎当场算的,不是我写死的。
这本书假设你已经会什么
写给这样的人
- 会写基本的 SQL:
SELECT/WHERE/JOIN/GROUP BY - 用过 MySQL(或 MariaDB / SQLite),有真实建表、查数据的经验
- 对 PostgreSQL 只有「听说很强」的印象,没真正上手过
- 想把 SQL 从「会用」变成「说得清为什么」
- 好奇 MVCC、EXPLAIN、事务隔离这些词底下到底是什么
暂时不适合
- 完全没写过 SQL——先找一份 30 分钟的 SQL 入门再回来
- 要的是 PostgreSQL 的完整参考手册(那是官方文档的活,这本是「讲透主干」)
- 要的是 DBA 运维大全(复制、分区、调参、高可用只在最后点到为止)
- 受不了「先讲清原理,再谈怎么用」这种顺序
这本书不需要你装任何东西就能读。Demo 就在网页里,引擎就是它本人。但 PostgreSQL 装起来很轻(brew install postgresql / docker run postgres / 一个免费云实例),第 2 章会带你三分钟跑起来——书里的每段 SQL 你都能在真库里亲手敲一遍,那才是最好的读法。
书里的 SQL 都以 PostgreSQL 16 / 17 为准。绝大多数也是标准 SQL,你在别处也用得上;凡是 PG 特有的地方,正文会明确标出来。
读法
顺着读。这本书是层层递进的:卷 II 把你会的 SQL 挖深(关系代数、NULL、JOIN、聚合、窗口、递归),卷 III 讲 PG 怎么「较真」地建模(类型与约束),卷 IV 讲它那套并发地基(事务与 MVCC),卷 V 讲它那个会思考的大脑(查询规划器),卷 VI 落到生产与迁移。后面的卷会用到前面的概念,跳着读会有点吃力。
每一章的最后都有一节 「对照 MySQL」:这一课里 PostgreSQL 的做法,和你熟悉的 MySQL 有什么不同、为什么不同。那是你把已有的 MySQL 直觉,稳稳搬到 PostgreSQL 上的桥。最后一章会把这些对照汇成一张完整的迁移速查表。