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;
相关推荐
菜菜小蒙6 分钟前
【MySQL】视图与用户管理
数据库·mysql
王景程12 分钟前
常见ADB指令
数据库
再看扣你眼14 分钟前
Mysql备份
数据库·mysql
DoWeixin621 分钟前
【请关注】各类数据库优化,抓大重点整改,快速优化空间mysql,Oracle,Neo4j等
数据库·mysql·oracle·neo4j
·心猿意码·34 分钟前
MySQL语法清单
数据库·mysql
消失在人海中40 分钟前
Oracle的Hint
数据库·oracle
Brookty41 分钟前
【MySQL】事务
数据库·后端·学习·mysql
云边有个稻草人3 小时前
智启未来:当知识库遇见莫奈的调色盘——API工作流重构企业服务美学
前端·数据库
雷神乐乐8 小时前
Oracle正则表达式学习
数据库·sql·oracle·正则表达式
江沉晚呤时8 小时前
SQL Server 事务详解:概念、特性、隔离级别与实践
java·数据库·oracle·c#·.netcore