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;
相关推荐
计算机毕设VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue医院设备管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
Mr__Miss2 小时前
保持redis和数据库一致性(双写一致性)
数据库·redis·spring
Knight_AL3 小时前
Spring 事务传播行为 + 事务失效原因 + 传播行为为什么不用其他模式
数据库·sql·spring
倔强的石头_3 小时前
时序数据时代的“存储与分析困局”解析及金仓解决方案
数据库
计算机毕设VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
倔强的石头_4 小时前
场景化落地指南——金仓时序数据库在关键行业的应用实践
数据库
SelectDB5 小时前
驾驭 CPU 与编译器:Apache Doris 实现极致性能的底层逻辑
运维·数据库·apache
zbguolei5 小时前
MySQL根据身份证号码计算出生日期和年龄
数据库·mysql
马克学长6 小时前
SSM校园图书借阅服务系统jd2z8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·图书管理系统·ssm 框架·ssm 校园图书借阅系统
软件派6 小时前
高斯数据库使用心得——从性能优化到行业实践的深度解析
数据库·oracle