CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
data JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT NOW()
);
PG 用 SERIAL 代替 AUTO_INCREMENT,原生支持 JSONB 类型
DDL
INSERT INTO users (id, name, email)
VALUES (1, '张三', 'z@test.com')
ON CONFLICT (id) DO UPDATE SET
name = EXCLUDED.name;
PG 的 Upsert 语法,ON CONFLICT 比 MySQL 的更灵活
DML
SELECT * FROM users
WHERE data->>>'city' = '深圳';
SELECT data->'tags' FROM users
WHERE data @> '{"vip": true}';
->>> 取文本值,@> 判断包含关系,PG 的 JSON 查询能力极强
查询
WITH RECURSIVE tree AS (
SELECT id, name, parent_id, 1 AS depth
FROM categories WHERE parent_id IS NULL
UNION ALL
SELECT c.id, c.name, c.parent_id, t.depth + 1
FROM categories c JOIN tree t ON c.parent_id = t.id
)
SELECT * FROM tree;
递归 CTE 查询树形结构(分类/组织架构),PG 的杀手级特性
查询
SELECT name, department, salary,
ROW_NUMBER() OVER(
PARTITION BY department
ORDER BY salary DESC
) AS rank
FROM employees;
窗口函数:按部门分组内排名,不折叠行数(比 GROUP BY 强大)
查询
\l -- 列出所有数据库
\dt -- 列出当前库所有表
\d users -- 查看表结构
\di -- 列出所有索引
\timing on -- 显示查询耗时
psql 客户端元命令速查,在终端操作 PG 必备
管理