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;
相关推荐
杨云龙UP13 分钟前
SQL 中的中括号 [ ]、双引号 “ “、反引号 ` `:SQL Server、Oracle、MySQL三大数据库标识符 定界符 详解
数据库·sql·mysql·postgresql·oracle·sqlserver
qqxhb44 分钟前
零基础学Java——第九章:数据库编程(三)
java·数据库·spring·mybatis
Leo.yuan2 小时前
直播数据大屏是什么?企业应如何构建直播数据大屏?
大数据·数据库·python·信息可视化·数据分析
2401_837088502 小时前
Mysql group by 用法
数据库·mysql
西门吹雪@1323 小时前
阿里云服务器-centos部署定时同步数据库数据-dbswitch
服务器·数据库·阿里云
Ten peaches4 小时前
苍穹外卖(订单状态定时处理、来单提醒和客户催单)
java·数据库·sql·springboot
gbase_lmax5 小时前
gbase8s数据库 tcp连接不同阶段的超时处理
网络·数据库·网络协议·tcp/ip
Aliano2175 小时前
Pinecone向量库 VS Redis
数据库·redis·缓存·pinecone向量库
爬呀爬的水滴5 小时前
02 mysql 管理(Windows版)
数据库·mysql