一、连接与基础操作
操作 | 命令 | 说明 |
|---|
连接到数据库 | psql -U 用户名 -d 数据库名 -h 主机地址 -p 端口号
| 使用 psql 客户端连接 PostgreSQL |
查看当前连接信息 | \conninfo
| 显示当前数据库连接详情 |
查看 PostgreSQL 版本 | SELECT VERSION();
| 返回数据库服务器版本 |
退出 psql | \q
| 退出 psql 命令行工具 |
二、数据库管理命令
操作 | SQL 命令 | 说明 |
|---|
查看所有数据库 | \l
| psql 元命令,列出所有数据库 |
创建数据库 | CREATE DATABASE 数据库名 OWNER 所有者;
| 创建一个新数据库,可指定所有者 |
切换数据库 | \c 数据库名
| 切换到指定的数据库 |
删除数据库 | DROP DATABASE 数据库名;
| 永久删除数据库,谨慎操作 |
查看当前数据库 | SELECT CURRENT_DATABASE();
| 显示当前连接的数据库名 |
修改数据库 | ALTER DATABASE 数据库名 RENAME TO 新名称;
| 重命名数据库 |
查看数据库大小 | SELECT pg_database_size('数据库名');
| 返回数据库占用的磁盘空间 |
三、模式(Schema)管理命令
操作 | SQL 命令 | 说明 |
|---|
查看所有模式 | \dn
| psql 元命令,列出所有模式 |
创建模式 | CREATE SCHEMA 模式名;
| 创建一个新模式 |
删除模式 | DROP SCHEMA 模式名;
| 删除一个模式 |
级联删除模式 | DROP SCHEMA 模式名 CASCADE;
| 强制删除模式及其下的所有对象 |
四、数据表管理命令
4.1 查看表信息
操作 | 命令 | 说明 |
|---|
查看所有表 | \dt
| 列出当前数据库中所有表 |
查看表结构 | \d 表名
| 显示表的列、类型、约束等详细信息 |
查看表的详细信息 | \dt+ 表名
| 显示包括注释、索引在内的更多信息 |
查看表的创建 SQL | SELECT pg_get_serial_sequence('表名','列名'); 或使用 pg_dump -t 表名
| 查看表的定义语句 |
4.2 创建与删除表
操作 | SQL 命令 |
|---|
创建表 | CREATE TABLE 表名 (列名 数据类型 [约束], …);
|
删除表 | DROP TABLE 表名;
|
条件删除表 | DROP TABLE IF EXISTS 表名;
|
创建表示例:
CREATE TABLE employees (
employee_id SERIAL PRIMARY KEY, -- 自增主键
first_name VARCHAR(50) NOT NULL, -- 名字,非空
last_name VARCHAR(50) NOT NULL, -- 姓氏,非空
email VARCHAR(100) UNIQUE NOT NULL, -- 邮箱,唯一且非空
phone VARCHAR(20), -- 电话,可选
hire_date DATE NOT NULL, -- 入职日期
salary NUMERIC(10,2) CHECK (salary > 0), -- 薪资,必须大于 0
department_id INT
);
4.3 修改表结构
操作 | SQL 命令 |
|---|
添加列 | ALTER TABLE 表名 ADD COLUMN 列名 数据类型;
|
删除列 | ALTER TABLE 表名 DROP COLUMN 列名;
|
修改列数据类型 | ALTER TABLE 表名 ALTER COLUMN 列名 TYPE 新数据类型;
|
重命名列 | ALTER TABLE 表名 RENAME COLUMN 旧列名 TO 新列名;
|
重命名表 | ALTER TABLE 旧表名 RENAME TO 新表名;
|
添加约束 | ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK (条件);
|
删除约束 | ALTER TABLE 表名 DROP CONSTRAINT 约束名;
|
清空表数据 | TRUNCATE TABLE 表名;
|
五、数据操作命令(DML)
5.1 插入数据
操作 | SQL 命令 |
|---|
插入单行 | INSERT INTO 表名 (列1, 列2, …) VALUES (值1, 值2, …);
|
插入多行 | INSERT INTO 表名 (列1, 列2, …) VALUES (值1, 值2), (值3, 值4), …;
|
从查询结果插入 | INSERT INTO 目标表 (列1, 列2) SELECT 列1, 列2 FROM 源表 WHERE 条件;
|
冲突时更新 | INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2) ON CONFLICT (冲突列) DO UPDATE SET 列1 = 新值;
|
5.2 查询数据
操作 | SQL 命令 |
|---|
基本查询 | SELECT 列1, 列2 FROM 表名 WHERE 条件;
|
查询所有列 | SELECT * FROM 表名;
|
条件查询 | SELECT * FROM 表名 WHERE 条件1 AND/OR 条件2;
|
排序查询 | SELECT * FROM 表名 ORDER BY 列名 ASC/DESC;
|
分组查询 | SELECT 列名, COUNT(*) FROM 表名 GROUP BY 列名;
|
分组后过滤 | SELECT 列名, COUNT(*) FROM 表名 GROUP BY 列名 HAVING COUNT(*) > 值;
|
限制结果数量 | SELECT * FROM 表名 LIMIT 数量 OFFSET 偏移量;
|
去重查询 | SELECT DISTINCT 列名 FROM 表名;
|
5.3 更新与删除数据
操作 | SQL 命令 |
|---|
更新数据 | UPDATE 表名 SET 列1 = 值1, 列2 = 值2 WHERE 条件;
|
删除数据 | DELETE FROM 表名 WHERE 条件;
|
从多表删除 | DELETE FROM 表1 USING 表2 WHERE 表1.列 = 表2.列 AND 条件;
|
返回修改的行 | UPDATE 表名 SET 列 = 值 WHERE 条件 RETURNING *;
|
六、索引与约束管理命令
6.1 索引操作
操作 | SQL 命令 |
|---|
查看索引 | \di 或 SELECT * FROM pg_indexes WHERE tablename = '表名';
|
创建普通索引 | CREATE INDEX 索引名 ON 表名 (列名);
|
创建唯一索引 | CREATE UNIQUE INDEX 索引名 ON 表名 (列名);
|
创建复合索引 | CREATE INDEX 索引名 ON 表名 (列1, 列2, …);
|
创建表达式索引 | CREATE INDEX 索引名 ON 表名 (LOWER(列名));
|
创建部分索引 | CREATE INDEX 索引名 ON 表名 (列名) WHERE 条件;
|
删除索引 | DROP INDEX 索引名;
|
重建索引 | REINDEX INDEX 索引名;
|
6.2 约束操作
约束类型 | SQL 示例 |
|---|
主键 | ALTER TABLE 表名 ADD PRIMARY KEY (列名);
|
外键 | ALTER TABLE 表名 ADD FOREIGN KEY (列名) REFERENCES 父表(列名);
|
唯一约束 | ALTER TABLE 表名 ADD UNIQUE (列名);
|
检查约束 | ALTER TABLE 表名 ADD CHECK (列名 > 0);
|
非空约束 | ALTER TABLE 表名 ALTER COLUMN 列名 SET NOT NULL;
|
七、事务与并发控制命令
操作 | SQL 命令 | 说明 |
|---|
开始事务 | BEGIN; 或 START TRANSACTION;
| 开启一个新事务 |
提交事务 | COMMIT;
| 提交当前事务,永久保存修改 |
回滚事务 | ROLLBACK;
| 回滚当前事务,撤销所有修改 |
设置保存点 | SAVEPOINT 保存点名;
| 在事务中创建回滚点 |
回滚到保存点 | ROLLBACK TO SAVEPOINT 保存点名;
| 回滚到指定保存点 |
释放保存点 | RELEASE SAVEPOINT 保存点名;
| 删除保存点 |
查看当前事务隔离级别 | SHOW TRANSACTION_ISOLATION;
| 返回当前会话的事务隔离级别 |
设置事务隔离级别 | SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
| 可选值:READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE |
锁定表 | LOCK TABLE 表名 IN ACCESS EXCLUSIVE MODE;
| 对表加锁,用于显式控制并发 |
八、用户与权限管理命令
8.1 用户/角色管理
操作 | SQL 命令 | 说明 |
|---|
查看所有用户/角色 | \du
| psql 元命令,列出所有角色及权限 |
创建用户(可登录) | CREATE USER 用户名 WITH LOGIN PASSWORD '密码';
| CREATE USER 是 CREATE ROLE … WITH LOGIN 的简写 |
创建角色(不可登录) | CREATE ROLE 角色名;
| 创建普通角色,通常用作权限组 |
创建超级用户 | CREATE ROLE super_admin WITH SUPERUSER LOGIN PASSWORD '密码';
| 创建具有超级权限的用户 |
修改密码 | ALTER ROLE 用户名 WITH PASSWORD '新密码';
| 修改用户密码 |
允许/禁止登录 | ALTER ROLE 用户名 WITH LOGIN/NOLOGIN;
| 控制用户是否可登录 |
授予超级用户权限 | ALTER ROLE 用户名 WITH SUPERUSER;
| 提升用户为超级用户 |
允许创建数据库 | ALTER ROLE 用户名 WITH CREATEDB;
| 授予创建数据库权限 |
删除用户 | DROP ROLE 角色名;
| 删除角色,需先确保无依赖对象 |
强制删除用户 | DROP ROLE IF EXISTS 角色名 CASCADE;
| 级联删除所有关联权限 |
8.2 权限授予与撤销
操作 | SQL 命令 | 说明 |
|---|
授予表权限 | GRANT SELECT, INSERT, UPDATE, DELETE ON 表名 TO 用户名;
| 授予用户对表的特定操作权限 |
授予所有权限 | GRANT ALL ON 表名 TO 用户名;
| 授予用户对表的所有权限 |
授予数据库权限 | GRANT CONNECT, CREATE ON DATABASE 数据库名 TO 用户名;
| 授予用户连接和创建模式的权限 |
授予模式权限 | GRANT USAGE ON SCHEMA 模式名 TO 用户名;
| 授予用户使用模式的权限 |
授予函数权限 | GRANT EXECUTE ON FUNCTION 函数名 TO 用户名;
| 授予用户执行函数的权限 |
撤销权限 | REVOKE 权限 ON 对象 FROM 用户名;
| 撤销用户权限 |
授予 PUBLIC | GRANT 权限 ON 对象 TO PUBLIC;
| 将权限授予所有用户 |
授予授予选项 | GRANT 权限 ON 对象 TO 用户名 WITH GRANT OPTION;
| 允许用户将权限授予他人 |
查看用户权限 | \du 或 SELECT * FROM information_schema.role_table_grants;
| 查看用户拥有的权限 |
九、psql 元命令大全
psql 元命令以反斜杠 \ 开头,是 PostgreSQL 客户端提供的快捷命令。
9.1 信息查询类
命令 | 说明 |
|---|
\l 或 \list
| 列出所有数据库 |
\c 数据库名
| 切换到指定数据库 |
\dt
| 列出当前数据库中的所有表 |
\dt+
| 列出所有表(含注释、大小等信息) |
\d 表名
| 查看指定表的结构 |
\d+ 表名
| 查看表结构(含存储参数、注释) |
\di
| 列出所有索引 |
\dn
| 列出所有模式 |
\df
| 列出所有函数 |
\dv
| 列出所有视图 |
\du 或 \dg
| 列出所有角色和用户 |
\conninfo
| 显示当前连接信息 |
9.2 格式控制类
命令 | 说明 |
|---|
\x
| 切换扩展显示模式(垂直显示,适合宽表) |
\pset format unaligned
| 设置无对齐输出格式(适合导出数据) |
\pset border 0\|1\|2
| 设置表格边框样式 |
\H
| 切换 HTML 输出格式 |
9.3 性能与统计类
命令 | 说明 |
|---|
\timing
| 切换 SQL 执行时间显示 |
\watch [秒数]
| 重复执行当前查询,用于监控 |
9.4 文件操作类
命令 | 说明 |
|---|
\i 文件名
| 执行指定 SQL 文件中的命令 |
\o 文件名
| 将查询结果重定向到文件 |
\copy
| 导入/导出数据(客户端侧) |
9.5 其他实用命令
命令 | 说明 |
|---|
\e
| 打开编辑器编辑当前查询缓冲区 |
\! 命令
| 在 shell 中执行外部命令 |
\?
| 查看所有元命令的帮助 |
\h SQL命令
| 查看指定 SQL 命令的语法帮助 |
十、数据类型速查
PostgreSQL 提供了丰富的内置数据类型。
10.1 数值类型
类型 | 别名 | 说明 |
|---|
SMALLINT
| int2
| 2 字节整数,范围 -32768 到 32767 |
INTEGER
| int, int4
| 4 字节整数,范围 -2³¹ 到 2³¹-1 |
BIGINT
| int8
| 8 字节整数,范围 -2⁶³ 到 2⁶³-1 |
DECIMAL(p,s)
| numeric
| 精确数字,可指定精度和小数位数 |
REAL
| float4
| 单精度浮点数,4 字节 |
DOUBLE PRECISION
| float8
| 双精度浮点数,8 字节 |
SERIAL
| serial4
| 自动增长的 4 字节整数 |
BIGSERIAL
| serial8
| 自动增长的 8 字节整数 |
10.2 字符串类型
类型 | 别名 | 说明 |
|---|
CHAR(n)
| character(n)
| 定长字符串,不足补空格 |
VARCHAR(n)
| character varying(n)
| 变长字符串,最大 n 字符 |
TEXT
| 无 | 变长字符串,无长度限制 |
BYTEA
| 无 | 二进制数据 |
10.3 日期/时间类型
类型 | 说明 |
|---|
DATE
| 日历日期(年、月、日) |
TIME
| 一天中的时间(无时区) |
TIMESTAMP
| 日期和时间(无时区) |
TIMESTAMPTZ
| 日期和时间(含时区) |
INTERVAL
| 时间段 |
10.4 其他常用类型
类型 | 说明 |
|---|
BOOLEAN
| 逻辑布尔值(真/假) |
JSON
| 文本 JSON 数据 |
JSONB
| 二进制 JSON 数据,支持索引 |
UUID
| 通用唯一标识码 |
INET
| IPv4 或 IPv6 主机地址 |
CIDR
| IPv4 或 IPv6 网络地址 |
MACADDR
| MAC 地址 |
十一、备份与恢复命令
11.1 pg_dump(单数据库备份)
操作 | 命令 | 说明 |
|---|
备份为 SQL 脚本 | pg_dump -U 用户名 -d 数据库名 > backup.sql
| 导出为纯文本 SQL 脚本 |
备份为自定义格式 | pg_dump -U 用户名 -d 数据库名 -Fc -f backup.dump
| 压缩的自定义格式,支持选择性恢复 |
仅备份结构 | pg_dump -U 用户名 -d 数据库名 --schema-only
| 只导出表结构,不导出数据 |
仅备份数据 | pg_dump -U 用户名 -d 数据库名 --data-only
| 只导出数据,不导出结构 |
备份指定表 | pg_dump -U 用户名 -d 数据库名 -t 表名 > table_backup.sql
| 只备份特定表 |
包含清理命令 | pg_dump -U 用户名 -d 数据库名 --clean
| 在创建前添加 DROP 命令 |
备份远程数据库 | pg_dump -h 主机 -p 端口 -U 用户名 -d 数据库名 > backup.sql
| 从远程数据库导出 |
11.2 pg_dumpall(全集群备份)
操作 | 命令 | 说明 |
|---|
备份所有数据库 | pg_dumpall -U 用户名 > all_backup.sql
| 备份整个 PostgreSQL 集群的所有数据库 |
仅备份全局对象 | pg_dumpall -U 用户名 --globals-only > globals.sql
| 只备份角色和表空间等全局对象 |
11.3 恢复
操作 | 命令 | 说明 |
|---|
从 SQL 脚本恢复 | psql -U 用户名 -d 数据库名 < backup.sql
| 执行 SQL 脚本恢复数据库 |
从自定义格式恢复 | pg_restore -U 用户名 -d 数据库名 backup.dump
| 使用 pg_restore 恢复归档格式 |
选择性恢复 | pg_restore -U 用户名 -d 数据库名 -t 表名 backup.dump
| 只恢复指定表 |
查看归档内容 | pg_restore -l backup.dump
| 列出归档文件中的内容 |
十二、性能分析与优化命令
12.1 执行计划分析
操作 | 命令 | 说明 |
|---|
查看执行计划 | EXPLAIN SELECT …;
| 显示 SQL 语句的执行计划 |
实际执行并分析 | EXPLAIN ANALYZE SELECT …;
| 实际执行并返回详细的执行统计信息 |
带缓冲区的分析 | EXPLAIN (ANALYZE, BUFFERS) SELECT …;
| 显示缓冲区使用情况 |
详细输出 | EXPLAIN (VERBOSE, ANALYZE) SELECT …;
| 输出更详细的执行信息 |
12.2 系统统计信息
操作 | 命令 | 说明 |
|---|
查看表统计信息 | SELECT * FROM pg_stats WHERE tablename = '表名';
| 查看表的数据分布统计 |
分析表(更新统计) | ANALYZE 表名;
| 手动更新表的统计信息 |
查看表大小 | SELECT pg_relation_size('表名');
| 返回表占用的磁盘空间 |
查看表总大小 | SELECT pg_total_relation_size('表名');
| 返回表及索引的总大小 |
查看所有表大小 | SELECT relname, pg_size_pretty(pg_relation_size(relid)) FROM pg_stat_user_tables ORDER BY pg_relation_size(relid) DESC;
| 按大小排序显示所有用户表 |
12.3 连接与活动监控
操作 | 命令 | 说明 |
|---|
查看当前活动连接 | SELECT * FROM pg_stat_activity;
| 查看所有当前连接的会话信息 |
终止连接 | SELECT pg_terminate_backend(pid);
| 终止指定 PID 的会话 |
查看锁信息 | SELECT * FROM pg_locks;
| 查看当前持有的锁 |
12.4 参数配置
操作 | 命令 | 说明 |
|---|
查看当前配置 | SHOW ALL;
| 显示所有配置参数 |
查看特定参数 | SHOW shared_buffers;
| 查看指定参数的值 |
设置参数 | SET work_mem = '16MB';
| 临时设置当前会话的参数 |
十三、常用函数速查
类别 | 函数示例 | 说明 |
|---|
字符串 | LENGTH(), UPPER(), LOWER(), CONCAT(), SUBSTRING()
| 字符串处理 |
日期时间 | NOW(), CURRENT_DATE, EXTRACT(), DATE_TRUNC()
| 日期时间处理 |
数学 | ROUND(), FLOOR(), CEIL(), ABS()
| 数学计算 |
聚合 | COUNT(), SUM(), AVG(), MAX(), MIN()
| 聚合统计 |
条件 | CASE WHEN … END, COALESCE(), NULLIF()
| 条件判断 |
JSON | jsonb_extract_path_text(), jsonb_array_elements()
| JSON 数据操作 |
窗口函数 | ROW_NUMBER(), RANK(), DENSE_RANK(), LAG(), LEAD()
| 高级分析查询 |
以上命令涵盖了 PostgreSQL 从基础到高级的绝大部分操作场景,可作为日常开发和运维的速查参考。如需特定模块的更详细说明,可以随时告知。