PostgreSQL(pgSQL)常用操作

目录

一、数据库管理(创建、连接、删除等)

[1. 创建数据库](#1. 创建数据库)

[2. 连接数据库](#2. 连接数据库)

[(1)命令行方式(psql 工具)](#(1)命令行方式(psql 工具))

[(2)SQL 内部切换数据库](#(2)SQL 内部切换数据库)

[3. 删除数据库](#3. 删除数据库)

二、表操作(创建、修改、删除、索引等)

[1. 创建表](#1. 创建表)

[2. 修改表(ALTER TABLE)](#2. 修改表(ALTER TABLE))

[3. 删除表](#3. 删除表)

[4. 查看表信息](#4. 查看表信息)

[5. 创建索引(优化查询速度)](#5. 创建索引(优化查询速度))

三、数据操作(增、删、改、查)

[1. 插入数据(INSERT)](#1. 插入数据(INSERT))

[2. 更新数据(UPDATE)](#2. 更新数据(UPDATE))

[3. 删除数据(DELETE)](#3. 删除数据(DELETE))

[4. 查询数据(SELECT)](#4. 查询数据(SELECT))

四、常用进阶操作

[1. 事务管理(保证数据一致性)](#1. 事务管理(保证数据一致性))

[2. 视图创建(简化复杂查询)](#2. 视图创建(简化复杂查询))

[3. 备份与恢复](#3. 备份与恢复)

[(1)备份数据库(pg_dump 工具,命令行执行)](#(1)备份数据库(pg_dump 工具,命令行执行))

[(2)恢复数据库(psql/pg_restore 工具)](#(2)恢复数据库(psql/pg_restore 工具))

五、用户与权限管理

[1. 创建用户](#1. 创建用户)

[2. 授权权限](#2. 授权权限)

[3. 删除用户](#3. 删除用户)

[六、psql 常用元命令(便捷操作)](#六、psql 常用元命令(便捷操作))


一、数据库管理(创建、连接、删除等)

1. 创建数据库

bash 复制代码
-- 基础创建
CREATE DATABASE db_name;

-- 指定字符集、所有者、编码(推荐生产环境使用)
CREATE DATABASE db_name
  WITH 
  OWNER = username        -- 数据库所有者
  ENCODING = 'UTF8'       -- 字符编码
  LC_COLLATE = 'zh_CN.UTF-8'  -- 排序规则
  LC_CTYPE = 'zh_CN.UTF-8'    -- 字符分类规则
  TABLESPACE = pg_default;    -- 表空间

2. 连接数据库

(1)命令行方式(psql 工具)

bash 复制代码
# 基础连接
psql -U username -d db_name -h host_ip -p port

# 示例:连接本地默认端口的test_db数据库
psql -U postgres -d test_db -h 127.0.0.1 -p 5432

# 本地默认配置(用户名postgres,端口5432)可简化
psql -d db_name

(2)SQL 内部切换数据库

bash 复制代码
\c db_name;  -- 等同于MySQL的use db_name;

3. 删除数据库

bash 复制代码
-- 基础删除(数据库不存在会报错)
DROP DATABASE db_name;

-- 安全删除(数据库不存在不报错)
DROP DATABASE IF EXISTS db_name;

-- 强制删除(断开所有连接后删除,需超级权限)
DROP DATABASE db_name WITH (FORCE);

二、表操作(创建、修改、删除、索引等)

1. 创建表

bash 复制代码
CREATE TABLE user_info (
  id SERIAL PRIMARY KEY,  -- 自增主键(SERIAL等价于int4+自增序列)
  username VARCHAR(50) NOT NULL UNIQUE,  -- 非空唯一
  age INT DEFAULT 0,      -- 默认值0
  email VARCHAR(100),
  create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  -- 默认当前时间
  update_time TIMESTAMP
);

-- 说明:PostgreSQL 10+推荐使用IDENTITY列替代SERIAL(更标准)
CREATE TABLE user_info (
  id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  -- 其他字段同上
);

2. 修改表(ALTER TABLE)

bash 复制代码
-- 1. 添加字段
ALTER TABLE user_info ADD COLUMN phone VARCHAR(20);

-- 2. 修改字段类型
ALTER TABLE user_info ALTER COLUMN email TYPE VARCHAR(150);

-- 3. 修改字段默认值
ALTER TABLE user_info ALTER COLUMN age SET DEFAULT 18;

-- 4. 删除字段
ALTER TABLE user_info DROP COLUMN IF EXISTS phone;

-- 5. 重命名字段
ALTER TABLE user_info RENAME COLUMN update_time TO modify_time;

-- 6. 重命名表
ALTER TABLE user_info RENAME TO user_info_new;

3. 删除表

bash 复制代码
-- 基础删除
DROP TABLE user_info;

-- 安全删除
DROP TABLE IF EXISTS user_info;

-- 级联删除(删除表及依赖它的对象,如外键关联)
DROP TABLE IF EXISTS user_info CASCADE;

4. 查看表信息

bash 复制代码
-- 方法1:查看当前数据库所有表
\dt

-- 方法2:查看指定表结构(详细字段信息)
\d user_info

-- 方法3:SQL查询表结构
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'user_info';

5. 创建索引(优化查询速度)

bash 复制代码
-- 普通索引
CREATE INDEX idx_user_username ON user_info(username);

-- 唯一索引(确保字段值唯一)
CREATE UNIQUE INDEX idx_user_email ON user_info(email);

-- 复合索引(多字段组合)
CREATE INDEX idx_user_age_create_time ON user_info(age, create_time);

-- 删除索引
DROP INDEX IF EXISTS idx_user_username;

三、数据操作(增、删、改、查)

1. 插入数据(INSERT)

bash 复制代码
-- 基础插入
INSERT INTO user_info (username, age, email)
VALUES ('zhangsan', 25, 'zhangsan@example.com');

-- 批量插入
INSERT INTO user_info (username, age, email)
VALUES 
('lisi', 28, 'lisi@example.com'),
('wangwu', 30, 'wangwu@example.com');

-- 插入并返回结果(获取自增ID等)
INSERT INTO user_info (username, age)
VALUES ('zhaoliu', 22)
RETURNING id, username, create_time;

2. 更新数据(UPDATE)

bash 复制代码
-- 基础更新
UPDATE user_info
SET age = 26, email = 'zhangsan_new@example.com'
WHERE username = 'zhangsan';

-- 安全更新(避免无WHERE条件更新全表)
UPDATE user_info
SET modify_time = CURRENT_TIMESTAMP
WHERE id = 1;

3. 删除数据(DELETE)

bash 复制代码
-- 基础删除
DELETE FROM user_info WHERE username = 'zhaoliu';

-- 清空全表(不可回滚,谨慎使用)
TRUNCATE TABLE user_info;

-- 清空全表并重置自增序列(SERIAL/IDENTITY列)
TRUNCATE TABLE user_info RESTART IDENTITY;

4. 查询数据(SELECT)

bash 复制代码
-- 基础查询
SELECT id, username, age FROM user_info;

-- 条件查询
SELECT * FROM user_info WHERE age > 25 AND email IS NOT NULL;

-- 排序查询
SELECT * FROM user_info ORDER BY age DESC, create_time ASC;

-- 分页查询(PostgreSQL特有,比LIMIT+OFFSET更高效)
-- 第1页(每页10条)
SELECT * FROM user_info ORDER BY id LIMIT 10 OFFSET 0;
-- 第2页
SELECT * FROM user_info ORDER BY id LIMIT 10 OFFSET 10;

-- 聚合查询
SELECT 
  COUNT(*) AS total_count,  -- 总条数
  AVG(age) AS avg_age,      -- 平均年龄
  MAX(age) AS max_age       -- 最大年龄
FROM user_info;

-- 分组查询
SELECT age, COUNT(*) AS user_count
FROM user_info
GROUP BY age
HAVING COUNT(*) > 1;  -- 分组后过滤

四、常用进阶操作

1. 事务管理(保证数据一致性)

bash 复制代码
-- 开启事务
BEGIN;

-- 执行操作(多个SQL语句)
INSERT INTO user_info (username, age) VALUES ('test1', 18);
UPDATE user_info SET age = 19 WHERE username = 'test1';

-- 提交事务(确认修改)
COMMIT;

-- 回滚事务(放弃修改,回到BEGIN前状态)
-- ROLLBACK;

2. 视图创建(简化复杂查询)

bash 复制代码
-- 创建视图
CREATE VIEW v_user_adult AS
SELECT id, username, email, create_time
FROM user_info
WHERE age >= 18;

-- 查询视图
SELECT * FROM v_user_adult;

-- 删除视图
DROP VIEW IF EXISTS v_user_adult;

3. 备份与恢复

(1)备份数据库(pg_dump 工具,命令行执行)

bash 复制代码
# 基础备份(导出SQL文件)
pg_dump -U username -d db_name -h host -p port > backup.sql

# 压缩备份(推荐,节省空间)
pg_dump -U username -d db_name | gzip > backup.sql.gz

# 仅备份表结构(不包含数据)
pg_dump -U username -d db_name -s > backup_schema.sql

(2)恢复数据库(psql/pg_restore 工具)

bash 复制代码
# 恢复SQL格式备份
psql -U username -d db_name -h host -p port < backup.sql

# 恢复压缩备份
gzip -d -c backup.sql.gz | psql -U username -d db_name

# 恢复自定义格式备份(pg_dump -F c导出的文件)
pg_restore -U username -d db_name -h host -p port backup.dump

五、用户与权限管理

1. 创建用户

bash 复制代码
-- 基础创建
CREATE USER user1 WITH PASSWORD '123456';

-- 创建带权限的用户(允许创建数据库、角色)
CREATE USER user2 WITH PASSWORD '123456' CREATEDB CREATEROLE;

2. 授权权限

bash 复制代码
-- 授予数据库所有权限
GRANT ALL PRIVILEGES ON DATABASE db_name TO user1;

-- 授予表的查询/插入权限
GRANT SELECT, INSERT ON TABLE user_info TO user1;

-- 授予序列权限(自增列需要)
GRANT USAGE, SELECT ON SEQUENCE user_info_id_seq TO user1;

-- 收回权限
REVOKE INSERT ON TABLE user_info FROM user1;

3. 删除用户

bash 复制代码
-- 基础删除
DROP USER IF EXISTS user1;

-- 级联删除(用户拥有的对象一并删除)
DROP USER IF EXISTS user2 CASCADE;

六、psql 常用元命令(便捷操作)

|----------------|-----------------|
| 元命令 | 功能说明 |
| \c db_name | 切换数据库 |
| \l | 查看所有数据库 |
| \dt | 查看当前数据库所有表 |
| \d table_name | 查看指定表结构 |
| \di | 查看所有索引 |
| \du | 查看所有用户 |
| \q | 退出 psql 终端 |
| \x | 切换横向 / 纵向显示查询结果 |
| \timing | 开启 / 关闭查询耗时统计 |

相关推荐
蝈蝈(GuoGuo)2 小时前
SQL Server 中指定范围分页取数详解
数据库
慕白Lee2 小时前
【PostgreSQL】日常总结
数据库·postgresql
sc.溯琛3 小时前
MySQL 视图实战:简化查询与数据安全管控指南
数据库
风月歌3 小时前
小程序项目之校园二手交易平台小程序源代码(源码+文档)
java·数据库·mysql·小程序·毕业设计·源码
西格电力科技3 小时前
绿电直连架构适配技术的发展趋势
大数据·服务器·数据库·架构·能源
计算机毕设VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue汽车销售系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·汽车·课程设计
@小白向前冲3 小时前
数据库创表(方便自己查看)
数据库·mysql
散一世繁华,颠半世琉璃3 小时前
高并发下的 Redis 优化:如何利用HeavyKeeper快速定位热 key
数据库·redis·缓存
咸鱼加辣3 小时前
【前端的crud】DOM 就是前端里的“数据库”
前端·数据库