PostgreSQL 速查指南:psql 命令与常用 SQL 一页查全
把每天在 psql 里真要敲的命令和 SQL 整理成一份能按场景查的速查,连接、查表、JSON 字段、索引、常用函数都覆盖,附 PostgreSQL 和 MySQL 的关键差异,少踩生产坑。
PostgreSQL 速查指南:psql 命令与常用 SQL 一页查全
用 PostgreSQL 久了会发现,真正卡住人的不是写不出查询,而是想不起那个 psql 反斜杠命令到底是 \dt 还是 \d,或者一个 JSON 字段该用 -> 还是 ->>。这篇把我自己每天在终端里高频敲的命令归类整理,按场景查,配合 PostgreSQL 速查表 这个工具里可搜索的 80+ 条目,基本能让你不再切去翻官方文档。
psql 连接和元命令
进库第一件事是确认连的是谁。psql 的反斜杠命令是它最值钱的部分,记住下面这几个就够覆盖九成日常:
\conninfo 看当前连的主机、库、用户
\l 列出所有数据库
\c shop 切到 shop 库
\dt 列出当前 schema 的所有表
\d orders 看 orders 表结构、索引、外键
\du 列出所有角色
\df 列出函数
\timing on 每条查询自动计时
\x auto 宽行自动竖排显示
\i seed.sql 执行一个 SQL 脚本文件
记不住的时候我一般直接在终端打 \d 然后回车,它会把所有相关元命令列给你,比去文档站翻快得多。
查询、JSON 字段和常用函数
基础查询不必多说,真正容易卡的是 JSONB。PostgreSQL 的 JSON 操作符一组看着像乱码,记住这几个就顺了:
-- -> 返回 JSON,->> 返回文本
SELECT data->'addr'->>'city' FROM users;
-- @> 判断包含,能走 GIN 索引
SELECT * FROM events WHERE payload @> '{"type":"signup"}';
-- jsonb_build_object 拼对象,jsonb_set 改单个 key
SELECT jsonb_set(payload, '{level}', '"vip"') FROM users;
常用函数里 coalesce 兜底空值、now() 取当前时间戳、string_agg 聚合拼接、generate_series 造序列都是高频。窗口函数 row_number() over (partition by user_id order by created_at) 这种排名场景一旦上手就回不去了。
索引:建对了才有用
索引建错等于没建。PostgreSQL 索引类型比 MySQL 丰富,按场景选:
- B 树:默认类型,等值和范围查询用它。
- GIN:JSONB 的 @> 包含查询、全文检索、数组都靠它。
- 部分索引:
CREATE INDEX ... WHERE status = 'active',只索引热数据。 - 函数索引:用 ->> 过滤 JSONB 时,普通 GIN 帮不上,得在
(payload->>'email')上单独建。
生产环境建索引必须加 CONCURRENTLY,否则普通 CREATE INDEX 会持 ACCESS EXCLUSIVE 锁,大表能堵几分钟写。这个坑我吃过一次:给一张几千万行的订单表临时加索引,没加 CONCURRENTLY,结果下单接口直接卡死好几分钟,监控告警全红。从那以后生产建索引这个词对我来说是肌肉记忆。
和 MySQL 的关键区别
从 MySQL 转过来的人最容易在这几个点上栽:
- 字符串字面量用单引号,双引号是给标识符(表名、列名)用的,写反了直接报错。
- 自增列用 serial 或 identity,不是 AUTO_INCREMENT;而且 serial 不在事务里,回滚的 INSERT 照样消耗 ID,所以会出空洞,拿来当发票号迟早翻车。
- 大小写不敏感比较没有内置,要装 citext 扩展或者自己 lower()。
- UPSERT 是
INSERT ... ON CONFLICT (id) DO UPDATE SET col = EXCLUDED.col,不是 MySQL 的ON DUPLICATE KEY UPDATE。 - 没有反引号,分页是
LIMIT n OFFSET m,时间类型优先用 timestamptz 而不是 timestamp。
按场景查,别背
速查表的意义是按场景查,不是背命令。半夜处理故障时,你需要的是三秒翻到 \conninfo 确认主机、用 pg_stat_activity 找堵塞的 PID;建模时需要快速判断 JSONB 还是真实列。这些都在 PostgreSQL 速查表 里跨命令、说明、例子、坑四个字段一起搜。如果你的活儿还涉及容器和脚本,搭配 SQL 速查表 和 Docker 速查表 一起用,整条技术栈的常用命令一页都能查到。
数据库这东西,记不住命令不丢人,丢人的是在生产大表上跑了一条没加 CONCURRENTLY 的 CREATE INDEX。把高频命令收进一个能搜的地方,把生产坑标在每条旁边,比硬背一百条命令实用得多。
Made by Toolora · Updated 2026-06-13