PostgreSQL 常用命令与函数全能速查表 (PostgreSQL CheatSheet)

专为 PostgreSQL 开发者与 DBA 整理的案头速查表,涵盖 psql 交互命令、JSONB 操作符、高频内置函数、GIN 索引与锁排查技巧。

发布于

PostgreSQL 作为当今功能最强大、生态最丰富的开源对象-关系型数据库,拥有独特丰富的元命令与高级数据特性。本文为您整理了开发与运维中最常用的核心技能速查。


一、 psql 交互终端核心元命令

在终端通过 psql -U username -d dbname 进入控制台后的必备快捷命令:

快捷命令 说明 实用技巧 / 示例
\l 或 \l+ 列出所有数据库及其字符集、大小 加 + 可查看物理磁盘占用大小
\c dbname [user] 切换连接至指定数据库或切换用户 \c production_db app_user
\dt 或 \dt+ 列出当前数据库的所有普通表 \dt+ 可查看表大小与描述
\d table_name 查看表结构、列定义、主外键与索引 \d+ 额外展示存储属性与注释
\dn 列出当前数据库的所有模式 (Schema) 默认模式通常为 public
\df [func_name] 查询函数列表与定义参数 \df *json* 模糊搜索 JSON 相关函数
\x [on/off/auto] 切换扩展展示模式 (垂直列出每行数据) 类似 MySQL 的 \G,排版宽表时极方便
\timing [on/off] 开启或关闭执行耗时统计 (毫秒) 测试 SQL 查询性能时必备
\i filename.sql 在 psql 内部执行本地 SQL 脚本文件 \i /tmp/init.sql
\q 退出 psql 控制台 也可直接按 Ctrl + D

二、 模式 (Schema) 与表操作

-- 创建模式并指定拥有者
CREATE SCHEMA IF NOT EXISTS core_app AUTHORIZATION postgres;

-- 设置当前会话的搜索路径 (优先访问哪个 Schema)
SET search_path TO core_app, public;

-- 创建带有 UUID 主键与 JSONB 字段的现代业务表
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    username VARCHAR(50) NOT NULL UNIQUE,
    profile JSONB NOT NULL DEFAULT '{}',
    tags TEXT[] DEFAULT '{}',
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

三、 JSON 与 JSONB 操作符速查 (PG 特色神器)

PostgreSQL 的 JSONB 支持高效的二进制索引与深度查询:

操作符 含义与行为 示例语句 返回结果
-> 按键获取 JSON 对象 (保持 JSON 类型) '{"a": {"b":"foo"}}'::jsonb -> 'a' {"b": "foo"}
->> 按键获取 JSON 文本值 (返回 TEXT 类型) '{"name": "Alice"}'::jsonb ->> 'name' 'Alice' (文本)
#> 按路径路径抽取 JSON 对象 '{"a": {"b": [1, 2]}}'::jsonb #> '{a,b}' [1, 2]
#>> 按路径抽取返回文本值 '{"a": {"b": [1, 2]}}'::jsonb #>> '{a,b,1}' '2'
@> 包含关系判断 (左边是否包含右边) '{"tags": ["sql", "pg"]}'::jsonb @> '{"tags": ["pg"]}' true
? JSONB 键或顶层数组元素是否存在 '{"city": "Beijing"}'::jsonb ? 'city' true
jsonb_set() 更新 JSONB 中的特定字段路径 jsonb_set('{"a":1}'::jsonb, '{b}', '2'::jsonb) {"a": 1, "b": 2}

四、 常用内置函数速查

1. 字符串与正则处理

-- 1. 正则匹配与提取
SELECT '2026-10-30' ~ '^\d{4}-\d{2}-\d{2}$';  -- 返回 true
SELECT SUBSTRING('order-2026-v1' FROM 'order-(\d{4})-'); -- 提取 '2026'

-- 2. 字符串聚合 (STRING_AGG)
SELECT dept_id, STRING_AGG(emp_name, ', ' ORDER BY salary DESC)
FROM employees
GROUP BY dept_id;

-- 3. 补齐与格式化
SELECT LPAD('123', 6, '0'); -- 输出 '000123'

2. 日期与时间 (TIMESTAMPTZ)

-- 提取指定日期字段 (EXTRACT / DATE_PART)
SELECT EXTRACT(YEAR FROM NOW()), EXTRACT(DOW FROM NOW()); -- DOW: 星期几 (0-6)

-- 时间间隔运算 (INTERVAL)
SELECT NOW() + INTERVAL '3 days 2 hours';
SELECT NOW() - INTERVAL '1 month';

-- 生成连续时间序列 (生成模拟数据神器)
SELECT generate_series(
    '2026-10-01'::date, 
    '2026-10-07'::date, 
    '1 day'::interval
)::date AS day;

五、 索引类型与高阶调优

PostgreSQL 提供了关系型数据库中最丰富的索引类型:

-- 1. 标准 B-Tree 索引 (通用查找、等值、范围查询)
CREATE INDEX idx_users_created_at ON users (created_at DESC);

-- 2. GIN 倒排索引 (针对 JSONB、数组、全文检索极速加速)
CREATE INDEX idx_users_profile_gin ON users USING GIN (profile);
-- 这样 profile @> '{"role": "admin"}' 能够走毫秒级索引扫描!

-- 3. 部分条件索引 (Partial Index: 仅为符合条件的行建立索引,节省空间)
CREATE INDEX idx_unpaid_orders ON orders (customer_id) WHERE status = 'unpaid';

-- 4. 表达式/函数索引
CREATE INDEX idx_lower_email ON users (LOWER(email));

EXPLAIN (ANALYZE, BUFFERS) 执行计划深度体检

EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM users WHERE profile @> '{"vip": true}';
  • Seq Scan:顺序全表扫描(数据量大时需警惕)。
  • Index Scan / Bitmap Index Scan:正常命中索引。
  • Buffers: shared hit=…:命中内存缓存的页数,read 代表物理磁盘读取。

六、 运维诊断:慢查询、阻塞锁与杀连接

1. 查看当前正在执行的所有耗时 SQL

SELECT 
    pid, 
    usename, 
    client_addr, 
    state, 
    NOW() - query_start AS duration, 
    query 
FROM pg_stat_activity
WHERE state != 'idle' 
ORDER BY duration DESC;

2. 查看锁阻塞情况 (谁堵死了谁)

SELECT 
    blocked_locks.pid     AS blocked_pid,
    blocked_activity.usename  AS blocked_user,
    blocking_locks.pid    AS blocking_pid,
    blocking_activity.usename AS blocking_user,
    blocked_activity.query    AS blocked_statement,
    blocking_activity.query   AS blocking_statement
FROM  pg_catalog.pg_locks         blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks         blocking_locks 
    ON blocking_locks.locktype = blocked_locks.locktype
    AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database
    AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
    AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
    AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
    AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
    AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
    AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
    AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
    AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
    AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;

3. 优雅终止或强制杀掉会话连接

-- 方式 A: 优雅取消正在运行的查询 (不切断连接)
SELECT pg_cancel_backend(12345);

-- 方式 B: 强制杀掉会话 (相当于 kill -9)
SELECT pg_terminate_backend(12345);

结语

本速查表浓缩了 PostgreSQL 最精髓的生产实战命令与 JSONB 处理技巧。想要系统学习从零到一的 PostgreSQL 体系,请参阅本站的 PostgreSQL 教程 与 PostgreSQL 参考手册。