PostgreSQL(简称 Postgres)是一个开源的对象-关系型数据库管理系统(ORDBMS)。它起源于20世纪80年代美国加州大学伯克利分校的 Postgres 项目,后来发展成为今天广泛使用的 PostgreSQL。
PostgreSQL 以稳定性、SQL 标准兼容性、可扩展性和丰富的数据类型著称,被广泛应用于互联网、金融、电商、GIS(地理信息系统)、数据分析等领域。
安装
Docker
1 2 3 4 5 6 7 8 9
| docker run -d \ --name postgres \ -e POSTGRES_USER=postgres \ -e POSTGRES_PASSWORD=123456 \ -e POSTGRES_DB=testdb \ -p 5432:5432 \ -v postgres_data:/var/lib/postgresql/data \ --restart unless-stopped \ postgres:17
|
参数说明:
--name postgres:容器名称
POSTGRES_USER:数据库用户名
POSTGRES_PASSWORD:数据库密码
POSTGRES_DB:容器启动后自动创建的数据库
-p 5432:5432:映射 PostgreSQL 默认端口
-v postgres_data:/var/lib/postgresql/data:数据持久化到 Docker Volume
--restart unless-stopped:Docker 启动时自动恢复容器
postgres:17:使用 PostgreSQL 17 官方镜像
基础语法
创建数据库
创建表
1 2 3 4 5 6 7
| CREATE TABLE student ( id SERIAL PRIMARY KEY, name VARCHAR(100), age INTEGER, score NUMERIC(5,2), birthday DATE );
|
创建索引
普通索引
1 2
| CREATE INDEX idx_name ON student(name);
|
唯一索引
1 2
| CREATE UNIQUE INDEX idx_email ON student(email);
|
PostgreSQL 还支持很多高级索引类型,例如:
- B-tree(默认,适合大多数查询)
- Hash
- GIN(适合数组、JSONB、全文搜索)
- GiST(适合地理空间、范围类型)
- SP-GiST
- BRIN(适合超大规模、顺序存储的数据)
插入数据
1 2 3 4 5
| INSERT INTO student(name, age, score) VALUES ('Alice',20,95.5), ('Bob',22,88.0), ('Tom',21,91.2);
|
查询数据
全部查询
指定列
1 2
| SELECT name, age FROM student;
|
条件查询
1 2 3
| SELECT * FROM student WHERE age > 20;
|
排序
1 2 3
| SELECT * FROM student ORDER BY score DESC;
|
分页
1 2 3 4
| SELECT * FROM student LIMIT 10 OFFSET 20;
|
更新数据
1 2 3
| UPDATE student SET score = 100 WHERE id = 1
|
删除数据
1 2
| DELETE FROM student WHERE id = 1;
|
删除全部
1 2 3
| DELETE FROM student;
TRUNCATE TABLE student;
|
条件表达式
等于
不等于
范围
1
| WHERE age BETWEEN 18 AND 25
|
属于
模糊匹配
大小写不敏感
聚合函数
1 2 3 4 5 6
| SELECT COUNT(*), AVG(score), MAX(score), MIN(score) FROM student;
|
事务
开始事务
修改
1 2 3 4 5 6
| UPDATE account SET money = money - 100 WHERE id = 1; UPDATE account SET money = money + 100 WHERE id = 2;
|
提交
失败回滚
数组
下标从1开始
建表
1 2 3 4
| CREATE TABLE users( id SERIAL, hobbies TEXT[] );
|
插入
1 2
| INSERT INTO users(hobbies) VALUES(ARRAY['music','game','movie']);
|
查询
1 2
| SELECT hobbies[1] FROM users;
|
JSON
1 2 3 4
| CREATE TABLE person( id SERIAL, info JSONB );
|
插入
1 2 3 4 5
| INSERT INTO person(info) VALUES('{ "name":"Tom", "age":20 }');
|
查询
1 2
| SELECT info->>'name' FROM person;
|
对比MySQL
| 对比项 |
PostgreSQL |
MySQL |
| 类型 |
对象关系型数据库(ORDBMS) |
关系型数据库(RDBMS) |
| SQL 标准 |
更接近 SQL 标准 |
有较多自己的实现和历史兼容性 |
| 开源协议 |
PostgreSQL License |
GPL(社区版) |
| 默认事务 |
全部支持 |
依赖存储引擎(现代常用的 InnoDB 支持) |
| JSON |
JSON、JSONB,功能强大 |
JSON 支持较基础 |
| 数组 |
原生支持 |
不支持 |
| 窗口函数 |
支持 |
MySQL 8.0 起支持 |
| CTE |
支持 |
MySQL 8.0 起支持 |
| GIS |
很强(配合扩展) |
基本支持 |
| 可扩展性 |
非常高,可自定义类型、函数、索引 |
相对较弱 |
| 学习难度 |
略高 |
较低 |
| 社区定位 |
企业级、复杂业务 |
Web 应用、互联网开发广泛使用 |