PostgreSQL
全面学习 PostgreSQL。涵盖 SQL 基础、连接查询、索引、事务、JSONB、EXPLAIN 及模式设计。
共 14 节,按顺序
- 120 分钟
什么是 PostgreSQL
设想你用一张电子表格记录一家小店的每一位客户、每一笔订单和每一件商品。一开始它够用,直到两个人同时去改同一张表,或者表格涨到几十万行、点一下就听见风扇狂转,或者有人手一抖敲错一个公式,整页的合计数字同时全错。电子表格没有任何规则来约束什么样的数据才算有效,也没办法让多个程序在同一时刻安全地读写它。数...
Relational databaseACIDMVCCPostgres vs MySQL vs SQLiteWhere Postgres shines - 225 分钟
psql 与初级命令
你已经知道 Postgres 是拿来做什么的了。接下来的问题更实际:到底该怎么跟它对话?一个正在运行的 Postgres 服务器只是静静地监听着某个网络端口,它没有窗口,没有按钮,也没有任何可以点击的东西。图形化的数据库工具当然存在,但那又是一样需要额外安装的东西,在你只能通过 SSH...
Psql command line clientConnecting as postgres userMeta commands like \l \c \dt \d \qSemicolons end statementsMultiline queriesSELECT version() - 330 分钟
创建数据库和表
到目前为止,你只是在别人搭好的服务器上四处看了看。学工具够用了,但放到真实项目上就寸步难行:你需要一块属于自己的地方来放数据,而在往任何地方放进第一行数据之前,Postgres...
CREATE DATABASECREATE TABLEPRIMARY KEYNOT NULLDEFAULTDROP TABLE+1 - 425 分钟
数据类型
到目前为止,你建的每一列都带着一个类型,TEXT、SERIAL、TIMESTAMPTZ,但没怎么解释为什么是这个类型而不是另一个。这件事比看上去要紧得多。类型挑得太窄,一个完全合法的值就会被拒收,更糟的是被悄悄截断。给钱挑错了数字种类,舍入误差会一分一分地从每笔交易里吃掉,直到有人发现账对不上。Po...
Integer and bigintNumeric vs floatText and varcharBooleanTimestamptz vs timestampDate+3 - 530 分钟
SELECT 与 WHERE
一张表里有几千行,而你只要其中七行。不是全部,也不是前一百行,而是符合你心里那条规则的那七行:上个月出版、评分高于四分、作者名字以 K 开头。靠翻页可解决不了。你这辈子会问数据库的每一个问题,本质上都是"把这些行、这些列,按这个顺序给我"的某种变体,而这一课教的就是把这句话说出口的语法。全程只用一张...
SELECT specific columnsWHERE with AND ORBETWEENINLIKE and ILIKEIS NULL+2 - 635 分钟
关联 (joins)
你的数据不在同一张表里,也不该在。用户住在 users 里,他们的文章住在 posts 里,把一篇文章和它的作者拴在一起的,只是某一列里的一个数字。这种拆分正是关系型数据库的用意所在:每个事实只写下一次。但只要有人要一个页面,把每位作者和他写的文章并排列出来,麻烦就来了,因为那个页面同时需要两张表。...
INNER JOINLEFT JOINRIGHT JOINFULL OUTER JOINSelf joinUSING vs ON - 730 分钟
聚合与分组
有人问你上个月店里生意怎么样。他们要的不是那四千行订单数据,而是一个数字,或者顶多是每位客户一个数字。如果你把这些行全都拉出来,再在应用代码里加总一遍,那你只是把数据库天生就能瞬间做完的事,写成了一个又慢又脆弱的版本。聚合是一类函数,它吃进很多行,吐出一个值:一个计数、一个总和、一个平均值。而分组让...
COUNTSUMAVGMINMAXGROUP BY+3 - 835 分钟
索引 (indexes)
这条查询在你笔记本电脑上跑得好好的,表里有两百行测试数据。到了生产环境,面对四百万行,同一条查询要花十一秒,页面直接超时。除了表的大小,什么都没变,而这就是全部原因:没人帮忙的时候,数据库回答 WHERE user_id = 42...
B-tree defaultCREATE INDEXMulti-column indexPartial index WHERE activeUnique indexWrite cost+1 - 935 分钟
事务 (transactions) 与隔离 (isolation)
两条 UPDATE 语句把钱从 Alice 转给 Bob。第一条执行完,连接断了,第二条永远没有发生,于是三十块钱就这么凭空消失了。两条语句本身都没有任何毛病,问题在于它们本该是一件事,却成了两件互不相干的事。事务(transaction)就是一组被数据库当作单个不可分割整体来对待的语句:要么全部生...
BEGIN COMMIT ROLLBACKSavepointsREAD COMMITTED defaultREPEATABLE READSERIALIZABLEDirty read non-repeatable read phantom read serialization anomaly - 1035 分钟
函数 (functions) 与触发器 (triggers)
你库里的每一张表都有一个 updated_at 列,而且每一个都是错的。倒不是一直错,只是在某些代码路径上有人忘了给它赋值:那个管理脚本、你手工跑的那次数据订正、还有同样往这张表里写数据的第三个服务。这个列本该是关于这一行的一个事实,结果却变成了每个写入方都得记着去兑现的承诺。Postgres...
CREATE FUNCTIONLANGUAGE plpgsqlRETURNSCREATE TRIGGERBEFORE UPDATENEW and OLD+1 - 1135 分钟
JSONB 与数组
有些数据就是不肯老老实实待在列里。比如一张产品表:笔记本电脑有内存大小,键盘有轴体类型,显示器有屏幕尺寸,下个月又有人往里加了一批蜡烛。你可以为每个属性加一列,然后看着这张表长出九十列、其中大部分都是空值;也可以自己造一张键值对的附属表,再手工给它写一套查询语言。PostgreSQL...
JSONB column-> operator->> operator@> contains operatorGIN index on jsonbText[] and integer[] arrays+2 - 1235 分钟
EXPLAIN 与查询调优
一个原本秒开的页面现在要加载九秒,人的本能反应是开始瞎猜。这里加个索引。把连接重写一遍。也许问题出在 ORDER BY。靠猜来调优数据库是个糟糕的办法,而之所以完全不必猜,是因为 Postgres...
EXPLAINEXPLAIN ANALYZESeq scan vs index scan vs index-only scanFixing a missing indexPg_stat_statements overview - 1325 分钟
备份与恢复
那个每晚定时执行的任务,已经往磁盘上写了八个月的文件,却从来没人打开过。那不叫备份,那只是一个寄托着希望的文件。备份只有在你第一次把它恢复出来、亲眼看到数据回来的那一刻,才真正成为备份。所以这一课在讲别的之前,先让你故意删掉一个数据库,再从转储文件里把它救回来。
Pg_dump custom formatPg_restorePlain SQL dumpsPoint-in-time recovery overview - 1460 分钟
顶点项目.设计一个模式
到目前为止,每一课都是把一张表交到你手上,让你去查它。真实工作恰好反过来:有人描述一个产品,而你得决定表有哪些、哪些列可以为空、删掉一个用户时会发生什么、以及产品要跑的那些查询里哪几条会慢。这个结业项目练的就是这项本事。你要从一套空表结构做起,一路做到一条能跑的统计查询,设计出一个小型博客背后的数据...
Schema designPrimary and foreign keysIndexes on hot columnsUpdated_at triggerJSONB metadataJoins with aggregates+1
用你的语言学习 PostgreSQL
每一节课、测验和导师回复都以你的语言显示。AI 导师会用你提问的语言来回答。
Roles that use PostgreSQL
See how hiring teams interview engineers on PostgreSQL, in production-like environments.
Database Administrator (DBA)
Hire DBAs in real workspaces with PostgreSQL or MySQL, real replication lag, real slow queries and real backups to restore. Live or take-home.
See the interviewBackend Engineer (Go, Rust, Java)
Hire backend engineers in real services with real databases, real concurrency and real latency budgets. Live or take-home, fully recorded.
See the interviewData Engineer
Hire data engineers in workspaces with real Spark, dbt and Airflow pipelines. Schema drift, bad data and reruns included.
See the interview