PostgreSQL
关系型数据库(PostgreSQL)
PostgreSQL 是一个功能强大的开源对象关系数据库系统,具有超过30年的积极开发历史。它以其可靠性、功能健壮性和性能而闻名。PostgreSQL 完全符合 ACID 标准,支持外键、触发器、视图和存储过程等高级功能。
与 MySQL 相比,PostgreSQL 更加注重标准的兼容性和扩展性,支持更丰富的数据类型(如 JSON、数组、范围类型等)和复杂查询,事务隔离级别和并发控制能力更强。PostgreSQL 支持多版本并发控制(MVCC),在高并发场景下表现优异,并且拥有更完善的扩展机制(如 pgvector、PostGIS 等),适合需要复杂数据处理和地理空间、向量等高级功能的场景。而 MySQL 则以易用性、部署简单和社区生态广泛著称,适合中小型应用和对性能要求较高但功能需求相对简单的场景。
PostgreSQL 核心特性
- ACID 合规性:完全支持原子性、一致性、隔离性和持久性
- 丰富的扩展生态:支持多种扩展,如 pgvector、PostGIS 等
- 高级数据类型:支持 JSON、数组、 范围类型等
- 并发控制:基于 MVCC 的多版本并发控制
- 全文搜索:内置全文搜索功能
- 地理信息:通过 PostGIS 扩展支持地理空间数据
基本连接和用户管理
-- 连接到 PostgreSQL
psql -h hostname -U username -d database_name
-- 创建用户
CREATE USER username WITH PASSWORD 'password';
-- 创建数据库
CREATE DATABASE database_name;
-- 授权用户访问数据库
GRANT ALL PRIVILEGES ON DATABASE database_name TO username;
-- 查看所有数据库
\l
-- 查看所有用户
\du
表操作
-- 创建表
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 查看表结构
\d table_name
-- 查看所有表
\dt
-- 删除表
DROP TABLE table_name;
-- 重命名表
ALTER TABLE old_name RENAME TO new_name;
列操作
-- 添加列
ALTER TABLE table_name ADD COLUMN column_name data_type [constraints];
-- 删除列
ALTER TABLE table_name DROP COLUMN column_name;
-- 修改列类型
ALTER TABLE table_name ALTER COLUMN column_name TYPE new_data_type;
-- 重命名列
ALTER TABLE table_name RENAME COLUMN old_name TO new_name;
-- 设置默认值
ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT value;
-- 移除默认值
ALTER TABLE table_name ALTER COLUMN column_name DROP DEFAULT;
数据操作
-- 插入数据
INSERT INTO users (username, email) VALUES ('john_doe', 'john@example.com');
-- 批量插入
INSERT INTO users (username, email) VALUES
('user1', 'user1@example.com'),
('user2', 'user2@example.com'),
('user3', 'user3@example.com');
-- 更新数据
UPDATE users SET email = 'new_email@example.com' WHERE username = 'john_doe';
-- 删除数据
DELETE FROM users WHERE username = 'john_doe';
-- 查询数据
SELECT * FROM users;
SELECT username, email FROM users WHERE created_at > '2024-01-01';
高级查询功能
-- 条件查询
SELECT * FROM users WHERE username LIKE 'john%';
SELECT * FROM users WHERE created_at BETWEEN '2024-01-01' AND '2024-12-31';
SELECT * FROM users WHERE email IS NOT NULL;
-- 排序
SELECT * FROM users ORDER BY created_at DESC;
SELECT * FROM users ORDER BY username ASC, created_at DESC;
-- 限制结果数量
SELECT * FROM users LIMIT 10;
SELECT * FROM users OFFSET 20 LIMIT 10;
-- 去重
SELECT DISTINCT username FROM users;
-- 聚合函数
SELECT COUNT(*) FROM users;
SELECT AVG(EXTRACT(YEAR FROM created_at)) FROM users;
SELECT username, COUNT(*) FROM posts GROUP BY username;