postgreSQL速查手册

一、psql 客户端 / 连接 / 帮助

功能命令
启动 psql 并以指定用户连接(本地)psql -U username
指定主机 / 端口 / 数据库psql -U username -h host -p port -d dbname
退出\q
帮助(SQL 命令语法)\h
帮助(psql 内建命令)\?
显示当前连接信息\conninfo
执行文件中的 SQL 脚本\i filename.sql
将输出重定向到文件\o filename(之后的查询结果写入该文件)
切换输出格式\x (切换扩展或垂直显示模式)
在 psql 中执行 shell 命令\! ls\! 命令

二、数据库 / 模式 / 对象 列表与信息

功能命令
列出所有数据库\l\list
列出所有模式(schemas)\dn
列出当前数据库下所有表(当前 schema)\dt
列出所有表(所有 schema)\dt *.*
查表结构 / 列 / 索引 / 约束 / 触发器\d table_name
更详细的表信息(含描述,表空间,行数估计等)\d+ table_name
列出视图\dv
列出函数 / 存储过程\df
列出扩展(Extensions)\dx
列出数据类型\dT / \dT+
列出索引\di
列出角色 / 用户\du

三、数据库 / 表 / 模式操作(DDL)

功能SQL 命令
创建数据库CREATE DATABASE dbname;
删除数据库DROP DATABASE IF EXISTS dbname;
重命名数据库ALTER DATABASE oldname RENAME TO newname;
创建表sql CREATE TABLE table_name ( <列定义>, … );
创建临时表CREATE TEMP TABLE temp_name (...);
删除表DROP TABLE IF EXISTS table_name;
增加列ALTER TABLE table_name ADD COLUMN col_name datatype;
删除列ALTER TABLE table_name DROP COLUMN col_name;
修改列类型ALTER TABLE table_name ALTER COLUMN col_name TYPE new_type;
重命名列ALTER TABLE table_name RENAME COLUMN old TO new;
重命名表ALTER TABLE old_table RENAME TO new_table;
添加 / 删除约束ALTER TABLE table_name ADD CONSTRAINT ... / DROP CONSTRAINT constraint_name;
注释表 / 列COMMENT ON TABLE table_name IS '...'; / COMMENT ON COLUMN table_name.col IS '...';

四、数据操作(DML:增删改查)

操作命令示例
插入单条记录INSERT INTO table_name (col1, col2) VALUES (val1, val2);
插入多条INSERT INTO table_name (cols…) VALUES (…),(…);
查询所有SELECT * FROM table_name;
查询指定列SELECT col1, col2 FROM table_name;
带条件查询SELECT * FROM table WHERE condition;
排序`... ORDER BY col1 ASC
限制 / 偏移... LIMIT n OFFSET m
聚合 + 分组SELECT col, COUNT(*) FROM table GROUP BY col;
分组过滤HAVING 子句用于过滤分组后结果
更新UPDATE table_name SET col1 = val1, col2 = val2 WHERE condition;
删除DELETE FROM table_name WHERE condition;
删除全部行TRUNCATE TABLE table_name;

五、事务 / 并发控制 / 锁

功能命令
开始事务BEGIN;START TRANSACTION;
提交COMMIT;
回滚ROLLBACK;
保存点SAVEPOINT savepoint_name;
回滚到保存点ROLLBACK TO SAVEPOINT savepoint_name;
设置事务隔离级别SET TRANSACTION ISOLATION LEVEL <级别>(如 READ COMMITTED, REPEATABLE READ, SERIALIZABLE)
控制锁 / 并发PostgreSQL 通常使用行锁(行级锁)与 MVCC(多版本并发控制),显式锁可用 LOCK TABLE

六、索引 / 约束 / 视图 / 函数

功能命令
创建索引CREATE INDEX idx_name ON table_name (col1, col2);
创建唯一索引CREATE UNIQUE INDEX idx_name ON table_name (col);
删除索引DROP INDEX IF EXISTS idx_name;
创建视图CREATE VIEW view_name AS SELECT ...;
删除视图DROP VIEW IF EXISTS view_name;
创建函数 / 存储过程PostgreSQL 用 CREATE FUNCTION ... RETURNS ... LANGUAGE ... AS $$ ... $$;
删除函数DROP FUNCTION IF EXISTS func_name(arg_types);
创建触发器`CREATE TRIGGER trg_name BEFORE
删除触发器DROP TRIGGER IF EXISTS trg_name ON table_name;

七、备份 / 恢复 / 导入导出

操作命令 / 工具
导出单个数据库pg_dump -U user -h host -d dbname > backup.sql
导出所有数据库pg_dumpall -U user > alldb_backup.sql
导出表 / 指定对象pg_dump -t table_name dbname > table_backup.sql
导入 SQL 文件psql -U user -d dbname < backup.sql
使用 pg_restorepg_restore -U user -d dbname backup_file
导出为 CSV在 psql 使用 \copy table TO 'file.csv' CSV HEADER;
从 CSV 导入\copy table FROM 'file.csv' CSV HEADER;

八、管理 / 监控 / 优化 / 配置

功能命令 / 示例
显示服务器版本SHOW server_version;
查看系统 / 配置变量SHOW ALL;SHOW config_var;
列出当前活动进程 / 会话查询 pg_stat_activity
获取表统计信息ANALYZE table_name;
查询执行计划EXPLAIN SELECT …; / EXPLAIN ANALYZE SELECT …;
管理扩展CREATE EXTENSION ext_name; / DROP EXTENSION ext_name;
启用 / 查看日志参数修改 postgresql.conf,如 log_min_duration_statementlog_statement
重载配置SELECT pg_reload_conf(); 或重启服务
清理 / 垃圾回收VACUUM;VACUUM FULL;

九、用户 / 角色 / 权限管理

PostgreSQL 的用户(user)与角色(role)是统一的概念。一个角色既可以登录(LOGIN 权限),也可以作为其他用户的组(类似 UNIX group)。

功能命令
创建用户CREATE USER username WITH PASSWORD 'secret';
创建角色CREATE ROLE rolename;
授予登录权限ALTER ROLE rolename WITH LOGIN;
授权角色GRANT rolename TO username;
撤销角色REVOKE rolename FROM username;
授权数据库访问GRANT CONNECT ON DATABASE dbname TO username;
授权表级操作GRANT SELECT, INSERT, UPDATE, DELETE ON table_name TO username;
授权模式(schema)访问GRANT USAGE ON SCHEMA schema_name TO username;
授权序列(sequence)访问GRANT USAGE, SELECT, UPDATE ON SEQUENCE seq_name TO username;
超级用户CREATE ROLE admin WITH SUPERUSER LOGIN PASSWORD 'pw';
修改密码ALTER ROLE username WITH PASSWORD 'newpw';
删除角色 / 用户DROP ROLE username;
查看当前用户SELECT current_user;\conninfo
查看角色属性\du+

十、JSON / JSONB 操作(NoSQL 风格)

PostgreSQL 的 JSONB 是结构化文档存储的利器,性能优秀且支持索引。

操作示例
插入 JSON 数据INSERT INTO users(data) VALUES ('{"name":"Falko","age":28}'::jsonb);
查询字段SELECT data->>'name' FROM users;
条件查询SELECT * FROM users WHERE data->>'age' = '28';
更新 JSON 字段UPDATE users SET data = jsonb_set(data, '{age}', '30', false);
合并 JSON`SELECT '{"a":1}'::jsonb
删除字段SELECT data - 'age' FROM users;
创建索引CREATE INDEX idx_gin_users_data ON users USING GIN (data);
查询包含关系SELECT * FROM users WHERE data @> '{"country":"China"}';
提取数组元素data->'friends'->>0(取第一个元素)

十一、数组(Array)类型操作

PostgreSQL 原生支持数组列,这在 SQL 世界中十分罕见。

功能命令
定义数组列CREATE TABLE t (tags TEXT[]);
插入数组INSERT INTO t VALUES (ARRAY['music','code']);
查询数组SELECT * FROM t WHERE 'code' = ANY(tags);
连接数组`SELECT ARRAY['a','b']
删除元素SELECT array_remove(ARRAY[1,2,3,2], 2);
展开数组(拆分为行)SELECT unnest(tags) FROM t;

十二、窗口函数(Window Functions)

窗口函数让你在不聚合的情况下执行排名、累积、分区统计。

功能示例
排名SELECT name, score, RANK() OVER (ORDER BY score DESC) FROM students;
行号SELECT ROW_NUMBER() OVER (PARTITION BY class ORDER BY score DESC);
累计和SUM(amount) OVER (ORDER BY date);
移动平均AVG(temp) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW);
差值计算LAG(value,1) OVER (ORDER BY id) / LEAD(value,1)

十三、CTE(公用表表达式)

CTE 是“临时命名子查询”,尤其在递归查询时非常强大。

-- 基本 CTE
WITH recent AS (
  SELECT * FROM orders WHERE created_at > now() - interval '7 days'
)
SELECT * FROM recent WHERE amount > 100;

-- 递归 CTE(求层级关系)
WITH RECURSIVE subordinates AS (
  SELECT id, name, manager_id FROM employees WHERE id = 1
  UNION ALL
  SELECT e.id, e.name, e.manager_id
  FROM employees e
  JOIN subordinates s ON e.manager_id = s.id
)
SELECT * FROM subordinates;

十四、时间与日期操作

功能示例
当前时间SELECT now();
仅日期 / 时间SELECT current_date, current_time;
时间加减SELECT now() + interval '2 hours';
时间差SELECT age('2025-10-07', '2000-06-01');
提取年月日SELECT extract(year FROM now()), extract(month FROM now());
格式化输出TO_CHAR(now(), 'YYYY-MM-DD HH24:MI:SS');
生成序列日期SELECT generate_series('2025-01-01'::date, '2025-12-31', '1 day');

十五、全文检索(Full Text Search)

PostgreSQL 原生支持强大的全文检索。

功能示例
建立 tsvector 字段ALTER TABLE docs ADD COLUMN textsearch tsvector;
更新字段UPDATE docs SET textsearch = to_tsvector('english', content);
查询SELECT * FROM docs WHERE textsearch @@ to_tsquery('database & system');
创建索引CREATE INDEX idx_docs_textsearch ON docs USING GIN(textsearch);
排序(匹配度)SELECT *, ts_rank(textsearch, to_tsquery('data')) AS rank FROM docs ORDER BY rank DESC;

十六、地理空间(PostGIS 简介)

安装扩展:

CREATE EXTENSION postgis;

常见用法:

功能示例
创建地理字段ALTER TABLE cities ADD COLUMN geom GEOGRAPHY(Point);
插入INSERT INTO cities(name, geom) VALUES ('Paris', ST_GeogFromText('POINT(2.3522 48.8566)'));
计算距离SELECT ST_Distance(a.geom, b.geom) FROM cities a, cities b;
判断包含ST_Contains(poly.geom, point.geom)
空间索引CREATE INDEX idx_geom ON cities USING GIST (geom);

十七、性能调优与维护

功能命令 / 工具
查看查询计划EXPLAIN (ANALYZE, BUFFERS) SELECT …;
分析表统计信息ANALYZE table_name;
重建索引REINDEX TABLE table_name;
手动清理垃圾行VACUUM;VACUUM FULL;
查看当前锁查询 pg_lockspg_stat_activity
强制终止连接SELECT pg_terminate_backend(pid);
并行查询确保 max_parallel_workers_per_gather > 0
监控 I/O、缓存命中率查询视图 pg_stat_bgwriterpg_stat_database
自动化清理使用 autovacuum,默认启用

十八、扩展功能与奇技淫巧

类别示例
UUID 自动生成CREATE EXTENSION "uuid-ossp";uuid_generate_v4()
JSON + GIN 索引混合查询支持 JSONB @> + B-tree 联合索引
UPSERT(存在则更新)INSERT INTO t (id, val) VALUES (1, 'A') ON CONFLICT (id) DO UPDATE SET val = EXCLUDED.val;
临时统计表CREATE TEMP TABLE tmp AS SELECT …;
随机取样TABLESAMPLE BERNOULLI(10);(抽取约 10% 数据)
复制结构不复制数据CREATE TABLE new_table (LIKE old_table INCLUDING ALL);

十九、信息视图(Information Schema)

PostgreSQL 有丰富的系统信息视图:

视图内容
information_schema.tables所有表元数据
information_schema.columns列名、类型、默认值等
pg_stat_activity当前活动查询与连接
pg_stat_user_tables表的读写次数统计
pg_indexes索引定义
pg_roles所有角色信息

添加新评论