跳到主要内容

PostgreSQL 速查表

本章提供 PostgreSQL 常用命令和操作的快速参考。

连接命令

# 本地连接
psql -U postgres

# 指定数据库连接
psql -U postgres -d mydb

# 指定主机和端口
psql -h localhost -p 5432 -U postgres -d mydb

# 执行命令后退出
psql -U postgres -d mydb -c "SELECT version();"

# 导入 SQL 文件
psql -U postgres -d mydb < backup.sql

# 导出查询结果
psql -U postgres -d mydb -c "SELECT * FROM users" -o output.txt

psql 常用命令

# 数据库操作
\l # 列出所有数据库
\l+ mydb # 查看数据库详情

# 表操作
\d # 列出当前数据库所有表
\d users # 查看 users 表结构
\d+ users # 详细查看 users 表
\dt # 列出所有表

# 索引操作
\di # 列出所有索引

# 用户和权限
\du # 列出所有用户
\du+ # 详细列出用户

# 其他
\? # 帮助
\h # SQL 命令帮助
\h SELECT # 查看 SELECT 命令帮助
\! cmd # 执行 shell 命令
\c mydb # 切换数据库
\conninfo # 查看连接信息
\x # 切换扩展显示模式
\timing # 开启/关闭执行时间显示

数据库操作

-- 创建数据库
CREATE DATABASE mydb;

-- 创建数据库(带选项)
CREATE DATABASE mydb
WITH
OWNER = postgres
ENCODING = 'UTF8'
TEMPLATE = template0;

-- 删除数据库
DROP DATABASE IF EXISTS mydb;

-- 查看数据库
SELECT datname FROM pg_database;

-- 查看当前数据库
SELECT current_database();

表操作

-- 创建表
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100),
age INTEGER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 查看表结构
\d users
SELECT * FROM information_schema.columns
WHERE table_name = 'users';

-- 添加列
ALTER TABLE users ADD COLUMN phone VARCHAR(20);

-- 删除列
ALTER TABLE users DROP COLUMN phone;

-- 修改列
ALTER TABLE users ALTER COLUMN age TYPE SMALLINT;
ALTER TABLE users ALTER COLUMN username SET NOT NULL;

-- 重命名表
ALTER TABLE users RENAME TO app_users;

-- 删除表
DROP TABLE IF EXISTS users;

数据类型

数值类型

-- 整数
SMALLINT, INTEGER, BIGINT

-- 浮点数
REAL, DOUBLE PRECISION, NUMERIC(10, 2)

-- 自增
SERIAL, BIGSERIAL

字符串类型

CHAR(10)     -- 固定长度
VARCHAR(100) -- 可变长度
TEXT -- 无限制

日期时间类型

DATE         -- 日期
TIME -- 时间
TIMESTAMP -- 日期时间(无时区)
TIMESTAMPTZ -- 日期时间(带时区)
INTERVAL -- 时间间隔

JSON 类型

JSON   -- 原始 JSON
JSONB -- 二进制 JSON(推荐)

数据操作

INSERT 插入

-- 插入单行
INSERT INTO users (username, email) VALUES ('john', '[email protected]');

-- 插入多行
INSERT INTO users (username, email) VALUES
('a', '[email protected]'),
('b', '[email protected]');

-- 插入并返回
INSERT INTO users (username) VALUES ('john') RETURNING id;

SELECT 查询

-- 基本查询
SELECT * FROM users;
SELECT username, email FROM users;

-- 条件查询
SELECT * FROM users WHERE age >= 18;

-- 排序
SELECT * FROM users ORDER BY created_at DESC;

-- 分页
SELECT * FROM users LIMIT 10 OFFSET 20;

-- 去重
SELECT DISTINCT department FROM users;

UPDATE 更新

-- 更新数据
UPDATE users SET age = 25 WHERE username = 'john';

-- 批量更新
UPDATE users SET age = age + 1 WHERE status = 'active';

-- 更新并返回
UPDATE users SET age = 30 WHERE id = 1 RETURNING *;

DELETE 删除

-- 删除数据
DELETE FROM users WHERE id = 1;

-- 清空表
DELETE FROM users;
-- 或
TRUNCATE TABLE users RESTART IDENTITY;

条件查询

-- WHERE 条件
WHERE age = 25
WHERE age != 25
WHERE age > 25
WHERE age >= 25 AND age <= 30
WHERE age BETWEEN 20 AND 30
WHERE name IN ('john', 'jane')
WHERE name LIKE 'j%'
WHERE name ILIKE 'JOHN' -- 不区分大小写
WHERE name IS NULL
WHERE name IS NOT NULL

连接查询

-- 内连接
SELECT * FROM a INNER JOIN b ON a.id = b.a_id;

-- 左连接
SELECT * FROM a LEFT JOIN b ON a.id = b.a_id;

-- 右连接
SELECT * FROM a RIGHT JOIN b ON a.id = b.a_id;

-- 全外连接
SELECT * FROM a FULL OUTER JOIN b ON a.id = b.a_id;

-- 自连接
SELECT a.name, b.name AS manager
FROM employees a
LEFT JOIN employees b ON a.manager_id = b.id;

聚合函数

-- 常用聚合
COUNT(*) -- 行数
SUM(column) -- 求和
AVG(column) -- 平均
MAX(column) -- 最大
MIN(column) -- 最小

-- 分组聚合
SELECT department, COUNT(*), AVG(salary)
FROM users
GROUP BY department
HAVING AVG(salary) > 5000;

-- 字符串聚合
STRING_AGG(name, ',') -- 逗号分隔
STRING_AGG(name, ',' ORDER BY salary) -- 带排序

窗口函数

-- 排名
ROW_NUMBER() OVER (ORDER BY salary DESC)
RANK() OVER (ORDER BY salary DESC)
DENSE_RANK() OVER (ORDER BY salary DESC)

-- 前后值
LAG(salary) OVER (ORDER BY id)
LEAD(salary) OVER (ORDER BY id)

-- 聚合窗口
SUM(salary) OVER (PARTITION BY department)
AVG(salary) OVER (ORDER BY id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)

索引操作

-- 创建索引
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_dept_salary ON users(department, salary);
CREATE UNIQUE INDEX idx_users_username ON users(username);

-- 创建特殊索引
CREATE INDEX idx_users_email_gin ON users USING GIN (email);
CREATE INDEX idx_users_name_lower ON users (LOWER(name));

-- 查看索引
SELECT * FROM pg_indexes WHERE tablename = 'users';

-- 删除索引
DROP INDEX idx_users_email;

事务控制

-- 开始事务
BEGIN;
-- 或
START TRANSACTION;

-- 提交
COMMIT;

-- 回滚
ROLLBACK;

-- 保存点
SAVEPOINT sp1;
ROLLBACK TO SAVEPOINT sp1;

用户和权限

-- 创建用户
CREATE USER john WITH PASSWORD 'password';

-- 授予权限
GRANT ALL PRIVILEGES ON DATABASE mydb TO john;
GRANT SELECT, INSERT ON users TO john;
GRANT ALL ON ALL TABLES IN SCHEMA public TO john;

-- 撤销权限
REVOKE INSERT ON users FROM john;

-- 查看权限
\dp users

-- 删除用户
DROP USER john;

备份和恢复

# 备份数据库
pg_dump -U postgres mydb > backup.sql

# 备份表
pg_dump -U postgres -t users mydb > users.sql

# 恢复数据库
psql -U postgres mydb < backup.sql

# 备份所有数据库
pg_dumpall -U postgres > all_databases.sql

# 只备份结构
pg_dump -U postgres -s mydb > schema.sql

# 只备份数据
pg_dump -U postgres -a mydb > data.sql

常用函数

字符串函数

LENGTH('hello')           -- 5
UPPER('hello') -- 'HELLO'
LOWER('HELLO') -- 'hello'
TRIM(' hello ') -- 'hello'
SUBSTRING('hello', 1, 3) -- 'hel'
REPLACE('hello', 'l', 'x') -- 'hexxo'
CONCAT('a', 'b', 'c') -- 'abc'

数值函数

ROUND(3.567, 2)          -- 3.57
CEIL(3.1) -- 4
FLOOR(3.9) -- 3
ABS(-5) -- 5
MOD(10, 3) -- 1

日期函数

NOW()                    -- 当前时间戳
CURRENT_DATE -- 当前日期
CURRENT_TIME -- 当前时间
EXTRACT(YEAR FROM now()) -- 年份
DATE_TRUNC('day', now()) -- 日期截断

流程控制

-- CASE
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C'
END

-- COALESCE
COALESCE(NULL, 'default') -- 'default'

-- NULLIF
NULLIF(10, 10) -- NULL

JSON 操作

-- 创建 JSON
'{"name": "John", "age": 30}'::json

-- 提取字段
data->>'name' -- 获取为文本
data->'name' -- 获取为 JSON

-- 查询
WHERE data @> '{"age": 30}'
WHERE data ? 'name'

-- 函数
JSON_OBJECT_AGG(key, value)
JSON_AGG(column)

性能分析

-- 查看执行计划
EXPLAIN SELECT * FROM users WHERE id = 1;

-- 详细分析(实际执行)
EXPLAIN ANALYZE SELECT * FROM users WHERE id = 1;

-- 查看慢查询日志
SHOW log_min_duration_statement;
SELECT * FROM pg_stat_statements;

-- 查看表大小
SELECT pg_size_pretty(pg_total_relation_size('users'));
SELECT pg_size_pretty(pg_relation_size('users'));

系统信息

-- 版本信息
SELECT version();

-- 当前用户
SELECT current_user;
SELECT user;

-- 数据库信息
SELECT current_database();
SELECT current_schema();

-- 配置信息
SHOW max_connections;
SELECT * FROM pg_settings;

小结

本速查表涵盖了 PostgreSQL 的常用操作:

  1. 连接和 psql 命令
  2. 数据库和表操作
  3. 数据类型
  4. CRUD 操作
  5. 查询和连接
  6. 聚合和窗口函数
  7. 索引操作
  8. 事务控制
  9. 用户和权限
  10. 备份恢复
  11. 常用函数
  12. JSON 操作
  13. 性能分析

建议将本页面收藏,作为日常开发的快速参考。