PostgreSQL 常用SQL操作命令

PostgreSQL 常用SQL操作命令

一、数据库操作

sql 复制代码
-- 创建数据库(指定编码)
CREATE DATABASE mydb 
  ENCODING 'UTF8' 
  LC_COLLATE 'en_US.utf8' 
  LC_CTYPE 'en_US.utf8';

-- 切换数据库
\c mydb

-- 删除数据库(需断开连接)
DROP DATABASE IF EXISTS mydb WITH (FORCE);

二、表操作

2.1 基础表管理

sql 复制代码
-- 创建表(含约束)
CREATE TABLE employees (
  id SERIAL PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  salary NUMERIC(10,2) CHECK (salary > 0),
  department_id INT REFERENCES departments(id),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 修改表结构
ALTER TABLE employees
  ADD COLUMN email VARCHAR(100) UNIQUE,
  ALTER COLUMN name TYPE VARCHAR(80);

2.2 索引管理

sql 复制代码
-- 创建复合索引
CREATE INDEX idx_emp_dept_salary 
  ON employees(department_id, salary DESC);

-- 创建表达式索引
CREATE INDEX idx_emp_lower_name 
  ON employees(LOWER(name));

-- 查看索引信息
\di+

三、数据操作

3.1 CRUD操作

sql 复制代码
-- 批量插入(RETURNING返回结果)
INSERT INTO employees (name, salary) 
VALUES 
  ('Alice', 65000),
  ('Bob', 72000)
RETURNING id, created_at;

-- 更新带条件
UPDATE employees 
SET salary = salary * 1.05 
WHERE department_id = 2 
  AND salary < 80000;

-- 删除软删除数据
DELETE FROM logs 
WHERE status = 'archived' 
  AND created_at < NOW() - INTERVAL '2 years';

3.2 高级查询

sql 复制代码
-- CTE递归查询
WITH RECURSIVE org_tree AS (
  SELECT id, name, manager_id
  FROM employees
  WHERE id = 100
  UNION ALL
  SELECT e.id, e.name, e.manager_id
  FROM employees e
  INNER JOIN org_tree o ON o.id = e.manager_id
)
SELECT * FROM org_tree;

-- 窗口函数使用
SELECT 
  name,
  salary,
  department_id,
  RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) 
FROM employees;

四、事务控制

sql 复制代码
BEGIN;
  SAVEPOINT before_update;
  UPDATE accounts SET balance = balance - 100 WHERE id = 1;
  UPDATE accounts SET balance = balance + 100 WHERE id = 2;
  -- 模拟错误检测
  -- ROLLBACK TO before_update;
COMMIT;

五、JSON操作

sql 复制代码
-- 创建JSON字段表
CREATE TABLE products (
  id SERIAL PRIMARY KEY,
  details JSONB NOT NULL
);

-- JSON路径查询
SELECT 
  details->>'name' AS product_name,
  details->'specs'->'weight' AS weight 
FROM products
WHERE details @> '{"category": "electronics"}';

六、维护命令

sql 复制代码
-- 分析表统计信息
ANALYZE VERBOSE employees;

-- 重建索引
REINDEX INDEX CONCURRENTLY idx_emp_name;

-- 查看锁信息
SELECT * FROM pg_locks 
WHERE relation = 'employees'::regclass;

-- 备份指定表
pg_dump -t employees mydb > employees_backup.sql

七、权限管理

sql 复制代码
-- 创建角色
CREATE ROLE analyst WITH
  LOGIN
  PASSWORD 'secure123'
  VALID UNTIL '2025-12-31';

-- 授权表访问
GRANT SELECT, INSERT ON employees TO analyst;

-- 查看权限
\dp employees

八、性能优化

sql 复制代码
-- 查看查询计划
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM employees WHERE salary > 50000;

-- 设置工作内存
SET work_mem = '64MB';

-- 强制使用索引
SET enable_seqscan = off;
相关推荐
司沐_Simuoss10 分钟前
Text to SQL系统的千层套路~
数据库·人工智能·sql·语言模型·系统架构
ptc学习者12 分钟前
验证mysql RR隔离水平,并未完全实现防止幻读的实验
数据库
qq_12498707531 小时前
基于协同过滤算法的运动场馆服务平台设计与实现(源码+论文+部署+安装)
java·大数据·数据库·人工智能·spring boot·毕业设计·计算机毕业设计
数据知道1 小时前
PostgreSQL 核心原理:读已提交与可重复读的底层实现差异(事务隔离级别)
数据库·postgresql
crossaspeed1 小时前
MySQL的MVCC
数据库·mysql
2401_857683541 小时前
为你的Python脚本添加图形界面(GUI)
jvm·数据库·python
m0_706653231 小时前
使用Python自动收发邮件
jvm·数据库·python
松涛和鸣2 小时前
DAY67 IMX6 Development Board Configuration from Scratch
数据库·postgresql·sqlserver
路由侠内网穿透.2 小时前
fnOS 飞牛云 NAS 本地部署私人影视库 MoonTV 并实现外部访问
运维·服务器·网络·数据库·网络协议
怣502 小时前
MySQL表筛选分组全解析:排序、分组与限制的艺术
数据库·mysql