PostgreSQL

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
CREATE DATABASE testdb;

创建表

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
SELECT * FROM student;

指定列

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 = 20

不等于

1
WHERE age <> 20

范围

1
WHERE age BETWEEN 18 AND 25

属于

1
WHERE age IN (18,20,22)

模糊匹配

1
WHERE name LIKE 'A%'

大小写不敏感

1
WHERE name ILIKE 'a%'

聚合函数

1
2
3
4
5
6
SELECT
COUNT(*),
AVG(score),
MAX(score),
MIN(score)
FROM student;

事务

开始事务

1
BEGIN;

修改

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
COMMIT;

失败回滚

1
ROLLBACK;

数组

下标从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 应用、互联网开发广泛使用

PostgreSQL
http://xwww12.github.io/2026/07/05/数据库/PostgreSQL/
作者
xw
发布于
2026年7月5日
许可协议