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 参考手册。