PgSQL操作文档

PostgreSQL(常简称为 PgSQL)是一款开源、功能强大、高度可扩展的关系型数据库管理系统(RDBMS),遵循 ACID 原则,支持复杂数据类型(如数组、JSON、地理信息等)和高级数据库特性(如事务、触发器、存储过程、全文搜索等),广泛应用于企业级应用、大数据分析、物联网等场景。

PgSQL核心特性

特性分类核心能力说明
数据类型支持基础类型支持整数(int2/int4/int8)、浮点(float4/float8)、字符(varchar/text)、日期时间(date/time/timestamp)等标准类型
复杂类型数组(如 int []、text [])、JSON/JSONB(高效存储和查询 JSON 数据)、枚举(enum)、地理信息(PostGIS 扩展支持)
自定义类型允许用户通过CREATE TYPE定义自定义复合类型(类似结构体)
事务与一致性ACID 合规完全支持原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
隔离级别支持 Read Uncommitted、Read Committed(默认)、Repeatable Read、Serializable 四种隔离级别,可按需选择
高级数据库功能存储过程 / 函数支持 PL/pgSQL(默认)、PL/Python、PL/Java 等多种编程语言编写存储过程,实现复杂业务逻辑
触发器支持行级 / 语句级触发器,可在 INSERT/UPDATE/DELETE 操作前后触发自定义逻辑(如数据校验、日志记录)
全文搜索内置全文搜索功能,无需依赖外部组件,支持中文分词(需扩展如 pg_jieba)
分区表支持范围分区(Range)、列表分区(List)、哈希分区(Hash),解决大表查询性能问题
扩展性扩展机制支持通过扩展(Extension)增强功能,如 PostGIS(地理信息)、pg_stat_statements(SQL 性能分析)、uuid-ossp(UUID 生成)
并行查询支持 SELECT、JOIN、排序等操作的并行执行,提升大数据量查询效率
安全性权限控制细粒度权限管理(库、表、列级权限),支持角色(Role)和用户组管理
数据加密支持传输加密(SSL)、存储加密(通过 pgcrypto 扩展)

PgSQL 核心操作(SQL 命令)

-- 创建数据库(指定所有者为myuser)
CREATE DATABASE mydb OWNER myuser;

-- 删除数据库(谨慎操作,不可逆)
DROP DATABASE IF EXISTS mydb;

-- 查看所有数据库
\l  -- psql命令(非SQL),或使用SQL:SELECT datname FROM pg_database;

\c mydb  -- psql命令,切换到mydb数据库

用户与权限管理

-- 创建角色(用户),允许登录并设置密码
CREATE ROLE myuser WITH LOGIN PASSWORD 'mypassword';

-- 授予角色数据库权限(如授予mydb的所有权限给myuser)
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

-- 授予表权限(如授予mytable的SELECT/INSERT权限给myuser)
GRANT SELECT, INSERT ON mytable TO myuser;

-- 查看角色列表
\du  -- psql命令,或使用SQL:SELECT rolname FROM pg_roles;

-- 删除角色
DROP ROLE IF EXISTS myuser;

表操作

创建表

CREATE TABLE users (
    id SERIAL PRIMARY KEY,  -- SERIAL:自增整数(类似MySQL的AUTO_INCREMENT)
    name VARCHAR(50) NOT NULL,  -- 非空字符串
    age INT CHECK (age > 0),  -- 检查约束:年龄必须大于0
    tags TEXT[],  -- 数组类型:存储多个标签
    profile JSONB,  -- JSONB类型:高效存储用户配置
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP  -- 默认值:当前时间
);

修改表结构

-- 1. 添加列
ALTER TABLE users ADD COLUMN email VARCHAR(100) UNIQUE;  -- 唯一约束

-- 2. 修改列类型
ALTER TABLE users ALTER COLUMN age SET DATA TYPE SMALLINT;

-- 3. 删除列
ALTER TABLE users DROP COLUMN IF EXISTS email;

-- 4. 查看表结构
\d users  -- psql命令,或使用SQL:SELECT * FROM information_schema.columns WHERE table_name = 'users';

删除表

DROP TABLE IF EXISTS users;  -- 谨慎操作,不可逆

数据CRUD操作

插入数据(INSERT)

-- 单条插入
INSERT INTO users (name, age, tags, profile)
VALUES ('Alice', 25, ARRAY['java', 'pg'], '{"city": "Beijing", "job": "engineer"}');

-- 多条插入
INSERT INTO users (name, age, tags, profile)
VALUES 
('Bob', 30, ARRAY['python', 'django'], '{"city": "Shanghai", "job": "developer"}'),
('Charlie', 28, ARRAY['go', 'grpc'], '{"city": "Guangzhou", "job": "architect"}');

查询数据(SELECT)

-- 1. 基础查询(查询所有列)
SELECT * FROM users;

-- 2. 条件过滤(年龄>25且标签包含'java')
SELECT name, age FROM users 
WHERE age > 25 AND 'java' = ANY(tags);  -- ANY:判断数组是否包含指定元素

-- 3. JSONB查询(查询城市为北京的用户)
SELECT name, profile->>'city' AS city  -- ->>:提取JSONB字段为文本
FROM users 
WHERE profile @> '{"city": "Beijing"}';  -- @>:JSONB包含判断

-- 4. 排序与分页(按创建时间降序,取第1-2条)
SELECT * FROM users 
ORDER BY created_at DESC 
LIMIT 2 OFFSET 0;  -- LIMIT:每页条数,OFFSET:偏移量(第N页:OFFSET (N-1)*LIMIT)

更新数据(UPDATE)

-- 更新Alice的年龄为26
UPDATE users 
SET age = 26, tags = ARRAY['java', 'pg', 'spring']  -- 同时更新数组
WHERE name = 'Alice';

删除数据(DELETE)

-- 删除年龄>30的用户(谨慎操作,建议先SELECT验证)
DELETE FROM users 
WHERE age > 30;

高级功能操作

类别:

没有回应

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注