1. PostgreSQL 数据库概述
PostgreSQL 是一个功能强大的开源关系型数据库系统,它已经发展了超过 30 年,以其可靠性、功能稳健性和性能而闻名。作为一个企业级的数据库解决方案,PostgreSQL 提供了许多高级功能,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。
PostgreSQL 的设计目标是符合 SQL 标准,同时提供许多现代数据库系统所期望的功能。它支持多种编程语言的接口,包括 C/C++、Java、Python、Ruby 等,使其成为开发人员的首选数据库之一。
提示:PostgreSQL 的发音是 "post-gres-Q-L",有时也被简称为 "Postgres"。
PostgreSQL 与其他流行的关系型数据库(如 MySQL)相比有几个显著区别:
- 更严格的 SQL 标准合规性
- 更丰富的内置数据类型
- 更强大的扩展性
- 更复杂的查询优化器
这些特性使得 PostgreSQL 特别适合处理复杂的数据操作和分析任务。在接下来的章节中,我们将深入探讨 PostgreSQL 的 SQL 查询能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. PostgreSQL 安装与基本配置
2.1 安装 PostgreSQL
在开始我们的 SQL 查询之旅前,首先需要在你的系统上安装 PostgreSQL。PostgreSQL 支持多种操作系统,包括 Linux、Windows 和 macOS。
对于 Linux 用户(以 Ubuntu 为例),可以通过以下命令安装:
bash复制sudo apt update
sudo apt install postgresql postgresql-contrib
Windows 用户可以从 PostgreSQL 官方网站下载图形化安装程序。安装过程中会提示你设置超级用户(postgres)的密码,这是管理数据库的重要凭证。
2.2 基本配置
安装完成后,需要进行一些基本配置:
- 启动 PostgreSQL 服务:
bash复制sudo service postgresql start
- 连接到 PostgreSQL:
bash复制sudo -u postgres psql
- 创建新用户和数据库:
sql复制CREATE USER myuser WITH PASSWORD 'mypassword';
CREATE DATABASE mydb OWNER myuser;
注意:在生产环境中,务必使用强密码并遵循安全最佳实践。
2.3 常用管理命令
掌握一些基本的 PostgreSQL 管理命令对日常使用很有帮助:
- 列出所有数据库:
\l - 连接到特定数据库:
\c database_name - 列出当前数据库的所有表:
\dt - 查看表结构:
\d table_name - 退出 psql:
\q
3. PostgreSQL SQL 查询基础
3.1 SELECT 语句
SELECT 语句是 SQL 中最基本也是最重要的命令,用于从数据库中检索数据。基本语法如下:
sql复制SELECT column1, column2, ...
FROM table_name
WHERE condition;
例如,从一个名为 "employees" 的表中查询所有数据:
sql复制SELECT * FROM employees;
查询特定列:
sql复制SELECT first_name, last_name FROM employees;
3.2 WHERE 子句
WHERE 子句用于过滤记录,只返回满足指定条件的行:
sql复制SELECT * FROM employees WHERE department = 'IT';
可以使用多种比较运算符:
- 等于:
= - 不等于:
<>或!= - 大于:
> - 小于:
< - 大于等于:
>= - 小于等于:
<=
3.3 排序与限制
ORDER BY 子句用于对结果集进行排序:
sql复制SELECT * FROM employees ORDER BY salary DESC;
LIMIT 子句用于限制返回的行数:
sql复制SELECT * FROM employees LIMIT 10;
两者可以结合使用:
sql复制SELECT * FROM employees ORDER BY hire_date DESC LIMIT 5;
4. 高级查询技术
4.1 连接查询
PostgreSQL 支持多种表连接方式,最常用的是 INNER JOIN:
sql复制SELECT e.first_name, e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
其他连接类型包括:
- LEFT JOIN(左连接)
- RIGHT JOIN(右连接)
- FULL JOIN(全连接)
- CROSS JOIN(交叉连接)
4.2 子查询
子查询是嵌套在其他查询中的查询,可以用于 WHERE、FROM 或 SELECT 子句中:
sql复制SELECT first_name, last_name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
4.3 聚合函数
PostgreSQL 提供了丰富的聚合函数:
- COUNT() - 计数
- SUM() - 求和
- AVG() - 平均值
- MAX() - 最大值
- MIN() - 最小值
使用 GROUP BY 对结果进行分组:
sql复制SELECT department, COUNT(*) as employee_count
FROM employees
GROUP BY department;
HAVING 子句用于过滤分组后的结果:
sql复制SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
5. PostgreSQL 特有功能
5.1 窗口函数
窗口函数是 PostgreSQL 的强大特性之一,允许在行集上执行计算,同时保留原始行:
sql复制SELECT
first_name,
last_name,
salary,
department,
AVG(salary) OVER (PARTITION BY department) as dept_avg_salary
FROM employees;
常用窗口函数包括:
- ROW_NUMBER() - 为行分配唯一序号
- RANK() - 为行分配排名,相同值有相同排名
- DENSE_RANK() - 类似 RANK(),但排名连续
- LEAD() 和 LAG() - 访问前后行的值
5.2 JSON 支持
PostgreSQL 提供了强大的 JSON 数据类型和操作函数:
sql复制-- 创建包含 JSON 列的表
CREATE TABLE products (
id serial PRIMARY KEY,
details jsonb
);
-- 插入 JSON 数据
INSERT INTO products (details)
VALUES ('{"name": "Laptop", "price": 999.99, "specs": {"cpu": "i7", "ram": "16GB"}}');
-- 查询 JSON 字段
SELECT details->>'name' as product_name
FROM products
WHERE (details->>'price')::numeric > 500;
5.3 全文搜索
PostgreSQL 提供了强大的全文搜索功能:
sql复制-- 创建包含全文搜索列的表
CREATE TABLE articles (
id serial PRIMARY KEY,
title text,
content text,
search_vector tsvector
);
-- 创建触发器自动更新搜索向量
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
ON articles FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(search_vector, 'pg_catalog.english', title, content);
-- 执行全文搜索
SELECT title, content
FROM articles
WHERE search_vector @@ to_tsquery('english', 'PostgreSQL & performance');
6. 性能优化技巧
6.1 索引优化
合理使用索引可以显著提高查询性能:
sql复制-- 创建普通索引
CREATE INDEX idx_employee_last_name ON employees(last_name);
-- 创建复合索引
CREATE INDEX idx_employee_dept_salary ON employees(department, salary);
-- 创建部分索引(只索引满足条件的行)
CREATE INDEX idx_high_salary_employees ON employees(salary) WHERE salary > 100000;
注意:虽然索引可以提高查询速度,但会增加插入、更新和删除操作的开销,并占用额外存储空间。
6.2 EXPLAIN 分析
使用 EXPLAIN 命令可以查看查询执行计划,帮助优化查询:
sql复制EXPLAIN ANALYZE SELECT * FROM employees WHERE department = 'IT';
分析执行计划时关注:
- 是否使用了预期的索引
- 是否有全表扫描(Seq Scan)
- 预估和实际行数的差异
- 执行时间
6.3 查询重写技巧
有时简单的查询重写可以带来显著的性能提升:
- 避免使用
SELECT *,只查询需要的列 - 使用 LIMIT 限制返回的行数
- 避免在 WHERE 子句中对列使用函数
- 考虑使用 CTE (WITH 子句) 简化复杂查询
7. 常见问题与解决方案
7.1 连接问题
问题:无法连接到 PostgreSQL 服务器
解决方案:
- 检查 PostgreSQL 服务是否运行:
sudo service postgresql status - 检查连接配置:
/etc/postgresql/[version]/main/pg_hba.conf - 确保防火墙允许 PostgreSQL 端口(默认 5432)
7.2 性能问题
问题:查询速度慢
解决方案:
- 使用 EXPLAIN ANALYZE 分析查询
- 检查并添加适当的索引
- 考虑对表进行分区
- 调整 PostgreSQL 配置参数(shared_buffers, work_mem 等)
7.3 数据备份与恢复
定期备份是数据库管理的重要部分:
bash复制# 使用 pg_dump 备份单个数据库
pg_dump -U username -d dbname -f backup.sql
# 备份所有数据库
pg_dumpall -U username -f alldb_backup.sql
# 恢复数据库
psql -U username -d dbname -f backup.sql
8. 实际应用案例
8.1 电商数据分析
假设我们有一个电商数据库,包含 customers、orders 和 products 表:
sql复制-- 查询每个客户的订单总金额
SELECT
c.customer_id,
c.customer_name,
SUM(o.quantity * p.price) as total_spent
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN products p ON o.product_id = p.product_id
GROUP BY c.customer_id, c.customer_name
ORDER BY total_spent DESC
LIMIT 10;
8.2 员工管理系统
复杂的人力资源分析查询:
sql复制-- 查询各部门薪资高于部门平均薪资的员工
WITH dept_avg AS (
SELECT
department,
AVG(salary) as avg_salary
FROM employees
GROUP BY department
)
SELECT
e.employee_id,
e.first_name,
e.last_name,
e.department,
e.salary,
da.avg_salary
FROM employees e
JOIN dept_avg da ON e.department = da.department
WHERE e.salary > da.avg_salary
ORDER BY e.department, e.salary DESC;
8.3 日志分析系统
使用 PostgreSQL 的日期时间和聚合函数分析应用日志:
sql复制-- 按小时统计错误日志
SELECT
date_trunc('hour', log_time) as hour,
COUNT(*) as error_count
FROM application_logs
WHERE log_level = 'ERROR'
GROUP BY hour
ORDER BY hour;
9. 扩展 PostgreSQL 功能
9.1 安装扩展
PostgreSQL 的扩展系统允许添加新功能:
sql复制-- 列出可用扩展
SELECT * FROM pg_available_extensions;
-- 安装扩展
CREATE EXTENSION pg_trgm; -- 用于模糊搜索
CREATE EXTENSION hstore; -- 键值对存储
9.2 常用扩展介绍
- PostGIS:地理空间数据库扩展
- pg_partman:自动化表分区管理
- pg_stat_statements:跟踪 SQL 语句执行统计
- uuid-ossp:生成 UUID
9.3 自定义函数
PostgreSQL 允许使用多种语言创建自定义函数:
sql复制-- 简单的 PL/pgSQL 函数
CREATE OR REPLACE FUNCTION get_employee_count(dept_name text)
RETURNS integer AS $$
DECLARE
emp_count integer;
BEGIN
SELECT COUNT(*) INTO emp_count
FROM employees
WHERE department = dept_name;
RETURN emp_count;
END;
$$ LANGUAGE plpgsql;
-- 使用函数
SELECT get_employee_count('IT');
10. PostgreSQL 与其他工具集成
10.1 可视化工具
常用的 PostgreSQL 可视化工具包括:
- pgAdmin(官方工具)
- DBeaver(跨平台)
- TablePlus(现代界面)
- Navicat for PostgreSQL(商业软件)
10.2 编程语言接口
PostgreSQL 支持几乎所有主流编程语言:
- Python:psycopg2 或 SQLAlchemy
- Java:JDBC 驱动
- Node.js:pg 模块
- Ruby:pg gem
Python 连接示例:
python复制import psycopg2
conn = psycopg2.connect(
host="localhost",
database="mydb",
user="myuser",
password="mypassword"
)
cur = conn.cursor()
cur.execute("SELECT * FROM employees")
rows = cur.fetchall()
for row in rows:
print(row)
cur.close()
conn.close()
10.3 数据迁移工具
常用数据迁移工具:
- pg_dump/pg_restore:PostgreSQL 自带工具
- Flyway:数据库迁移版本控制
- Liquibase:数据库变更管理
- AWS Database Migration Service:云服务迁移
11. 安全最佳实践
11.1 用户权限管理
遵循最小权限原则:
sql复制-- 创建只读用户
CREATE USER readonly WITH PASSWORD 'readonly123';
GRANT CONNECT ON DATABASE mydb TO readonly;
GRANT USAGE ON SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
11.2 数据加密
PostgreSQL 提供多种加密选项:
- 传输加密(SSL)
- 列级加密(pgcrypto 扩展)
- 透明数据加密(TDE)通过第三方扩展
使用 pgcrypto 加密示例:
sql复制CREATE EXTENSION pgcrypto;
-- 加密数据
INSERT INTO users (username, password)
VALUES ('alice', crypt('mypassword', gen_salt('bf')));
-- 验证密码
SELECT username FROM users
WHERE username = 'alice'
AND password = crypt('mypassword', password);
11.3 SQL 注入防护
防止 SQL 注入的最佳实践:
- 使用参数化查询
- 使用 ORM 框架
- 限制数据库用户权限
- 定期更新 PostgreSQL 版本
Python 中参数化查询示例:
python复制# 不安全的方式
cur.execute(f"SELECT * FROM users WHERE username = '{username}'")
# 安全的方式
cur.execute("SELECT * FROM users WHERE username = %s", (username,))
12. 监控与维护
12.1 监控关键指标
需要监控的重要 PostgreSQL 指标:
- 连接数
- 缓存命中率
- 锁等待
- 复制延迟(如果使用复制)
查询当前活动连接:
sql复制SELECT * FROM pg_stat_activity;
12.2 定期维护任务
重要的维护任务:
- 定期 ANALYZE 更新统计信息
- 定期 VACUUM 回收空间
- 定期 REINDEX 重建索引
- 定期备份
设置自动维护(autovacuum):
sql复制-- 检查 autovacuum 设置
SELECT name, setting FROM pg_settings WHERE name LIKE 'autovacuum%';
-- 手动执行 VACUUM 和 ANALYZE
VACUUM (VERBOSE, ANALYZE) table_name;
12.3 日志分析
配置和利用 PostgreSQL 日志:
- 配置日志输出:
/etc/postgresql/[version]/main/postgresql.conf - 重要的日志设置:
- log_statement = 'all'(记录所有语句)
- log_duration = on(记录查询持续时间)
- log_min_duration_statement = 1000(记录执行时间超过1秒的查询)
使用 pgBadger 等工具分析日志:
bash复制pgbadger /var/log/postgresql/postgresql-*.log -o pgbadger_report.html
13. PostgreSQL 版本升级
13.1 升级策略
PostgreSQL 主要版本升级方法:
- 使用 pg_dump/pg_restore
- 使用 pg_upgrade(原地升级)
- 使用逻辑复制
13.2 使用 pg_upgrade
pg_upgrade 的基本步骤:
bash复制# 停止旧版本
sudo service postgresql stop
# 执行升级
sudo -u postgres /usr/lib/postgresql/14/bin/pg_upgrade \
-b /usr/lib/postgresql/12/bin \
-B /usr/lib/postgresql/14/bin \
-d /var/lib/postgresql/12/main \
-D /var/lib/postgresql/14/main
# 启动新版本
sudo service postgresql start
13.3 升级后验证
升级后需要检查:
- 数据完整性
- 应用程序兼容性
- 性能变化
- 扩展兼容性
验证查询:
sql复制SELECT version();
SELECT count(*) FROM pg_available_extensions;
14. PostgreSQL 高可用方案
14.1 复制配置
设置流复制:
- 主服务器配置(postgresql.conf):
code复制wal_level = replica
max_wal_senders = 3
- 从服务器配置(recovery.conf):
code复制standby_mode = on
primary_conninfo = 'host=master_host user=replication_user password=replication_password'
14.2 故障转移
手动故障转移步骤:
- 停止主服务器
- 提升从服务器:
sql复制SELECT pg_promote();
14.3 使用 Patroni 自动化管理
Patroni 是一个流行的 PostgreSQL 高可用解决方案,提供:
- 自动故障检测和转移
- 配置管理
- 监控集成
基本架构包括:
- PostgreSQL 集群(主+从)
- 分布式配置存储(如 etcd, ZooKeeper)
- Patroni 守护进程
15. PostgreSQL 与大数据
15.1 处理大数据集
PostgreSQL 处理大数据的技巧:
- 表分区
- 并行查询
- 物化视图
- FDW(外部数据包装器)
创建分区表示例:
sql复制CREATE TABLE measurement (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
-- 创建分区
CREATE TABLE measurement_y2020 PARTITION OF measurement
FOR VALUES FROM ('2020-01-01') TO ('2021-01-01');
15.2 与 Hadoop/Spark 集成
使用 FDW 连接外部系统:
sql复制-- 安装 hadoop_fdw 扩展
CREATE EXTENSION hadoop_fdw;
-- 创建服务器
CREATE SERVER hadoop_server FOREIGN DATA WRAPPER hadoop_fdw
OPTIONS (host 'hadoop-host', port '8020');
-- 创建映射
CREATE USER MAPPING FOR postgres SERVER hadoop_server
OPTIONS (username 'hadoop-user', password 'hadoop-password');
-- 创建外部表
CREATE FOREIGN TABLE hadoop_sales (
id int,
sale_date date,
amount numeric
) SERVER hadoop_server
OPTIONS (table_name 'sales');
15.3 时序数据处理
对于时序数据,可以考虑:
- TimescaleDB 扩展(PostgreSQL 的时序数据库扩展)
- 自定义分区策略(按时间分区)
- 专用索引(BRIN 索引)
TimescaleDB 示例:
sql复制-- 创建超表
CREATE TABLE conditions (
time TIMESTAMPTZ NOT NULL,
device_id TEXT,
temperature DOUBLE PRECISION
);
SELECT create_hypertable('conditions', 'time');
-- 查询时间序列数据
SELECT time_bucket('1 hour', time) as hour,
avg(temperature)
FROM conditions
GROUP BY hour
ORDER BY hour;
16. PostgreSQL 未来发展趋势
16.1 最新版本特性
PostgreSQL 持续创新,最新版本增加了:
- 分布式 SQL 功能
- 增强的并行查询
- 改进的分区性能
- 新的监控功能
16.2 云原生 PostgreSQL
云服务提供商提供的 PostgreSQL 服务:
- AWS RDS for PostgreSQL
- Azure Database for PostgreSQL
- Google Cloud SQL for PostgreSQL
- 阿里云 ApsaraDB for PostgreSQL
16.3 PostgreSQL 与 AI
PostgreSQL 在 AI 领域的应用:
- 使用 PL/Python 实现机器学习模型
- 与 TensorFlow/PyTorch 集成
- 使用 MADlib 扩展进行数据库内分析
PL/Python 机器学习示例:
sql复制CREATE OR REPLACE FUNCTION predict_sales(month int)
RETURNS float AS $$
from sklearn.linear_model import LinearRegression
import numpy as np
# 获取训练数据
plan = plpy.prepare("SELECT month, sales FROM historical_sales", [])
rows = plpy.execute(plan)
X = np.array([row['month'] for row in rows]).reshape(-1, 1)
y = np.array([row['sales'] for row in rows])
# 训练模型
model = LinearRegression().fit(X, y)
# 预测
return float(model.predict([[month]]))
$$ LANGUAGE plpython3u;
17. 学习资源推荐
17.1 官方文档
PostgreSQL 官方文档是最权威的学习资源:
- 入门指南
- SQL 语言参考
- 服务器管理
- 客户端接口
17.2 在线课程
推荐的在线学习平台:
- PostgreSQL Tutorial(免费)
- Udemy 上的 PostgreSQL 课程
- Coursera 数据库专项课程
- 极客时间《PostgreSQL 实战》
17.3 社区与论坛
活跃的 PostgreSQL 社区:
- PostgreSQL 官方邮件列表
- Stack Overflow 上的 PostgreSQL 标签
- Reddit 的 r/PostgreSQL
- 中文社区:PostgreSQL 中文网
17.4 书籍推荐
经典 PostgreSQL 书籍:
- 《PostgreSQL 即学即用》
- 《PostgreSQL 修炼之道》
- 《PostgreSQL 高可用性》
- 《PostgreSQL 数据库内核分析》
18. 实际项目经验分享
18.1 数据库设计经验
在 PostgreSQL 数据库设计中,我总结了几点重要经验:
-
数据类型选择:PostgreSQL 有丰富的数据类型,选择合适类型能提高性能和存储效率。例如:
- 使用
text而不是varchar(n),除非有明确的长度限制 - 对于枚举值,考虑使用
enum类型而非字符串 - 对于地理位置数据,使用 PostGIS 的
geometry类型
- 使用
-
规范化与反规范化:根据查询模式决定规范化程度。分析型查询多的场景可以适当反规范化。
-
命名约定:保持一致的命名约定(如表名复数,列名小写加下划线)能提高可维护性。
18.2 查询优化案例
一个实际的查询优化案例:
原始查询(执行时间 12 秒):
sql复制SELECT c.customer_name, o.order_date, p.product_name
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE c.registration_date > '2020-01-01'
ORDER BY o.order_date DESC;
优化措施:
- 为 registration_date 和 order_date 创建索引
- 重写查询使用 CTE 先过滤客户
- 只选择必要的列
优化后查询(执行时间 0.8 秒):
sql复制WITH recent_customers AS (
SELECT customer_id, customer_name
FROM customers
WHERE registration_date > '2020-01-01'
)
SELECT c.customer_name, o.order_date, p.product_name
FROM recent_customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
ORDER BY o.order_date DESC;
18.3 扩展使用心得
在使用 PostgreSQL 扩展方面的经验:
-
PostGIS:处理地理空间数据非常强大,但需要注意:
- 空间索引(GIST)需要定期维护
- 复杂空间操作可能消耗大量资源
-
pg_partman:管理分区表的利器:
- 自动化分区创建和维护
- 支持按时间或 ID 范围分区
- 需要合理配置保留策略
-
pg_stat_statements:性能分析必备:
- 识别最耗资源的查询
- 跟踪查询执行统计
- 需要定期重置统计数据
19. PostgreSQL 与其他数据库比较
19.1 与 MySQL 比较
PostgreSQL 与 MySQL 的主要区别:
| 特性 | PostgreSQL | MySQL |
|---|---|---|
| SQL 标准兼容性 | 高 | 中等 |
| 事务隔离级别 | 支持所有级别 | 默认 REPEATABLE READ |
| 存储引擎 | 单一引擎 | 多引擎(InnoDB, MyISAM等) |
| JSON 支持 | 强大(jsonb) | 有限 |
| 复制 | 流复制 | 基于 binlog |
| 扩展性 | 优秀 | 有限 |
19.2 与 Oracle 比较
PostgreSQL 作为开源数据库与 Oracle 的对比:
| 方面 | PostgreSQL | Oracle |
|---|---|---|
| 成本 | 免费 | 商业许可 |
| 性能 | 优秀 | 卓越 |
| 高可用 | 需要配置 | 企业级解决方案 |
| 分区 | 原生支持 | 高级分区选项 |
| 安全性 | 良好 | 企业级安全 |
| 支持 | 社区/商业 | 官方支持 |
19.3 选择建议
选择数据库时的考虑因素:
- 预算:PostgreSQL 是免费的,Oracle 成本高
- 功能需求:复杂分析选 PostgreSQL,企业级功能选 Oracle
- 团队技能:考虑现有团队熟悉度
- 生态系统:评估工具链和第三方支持
对于大多数 Web 应用和企业应用,PostgreSQL 是完全够用的选择。
20. 总结与进阶建议
经过这次 PostgreSQL SQL 查询之旅,我们涵盖了从基础安装到高级特性的广泛内容。PostgreSQL 是一个功能丰富、可扩展性强的数据库系统,适用于各种规模的应用。
对于想要深入学习的开发者,我建议:
- 实践项目:选择一个实际项目应用所学知识
- 阅读源码:PostgreSQL 是开源的,阅读源码能深入理解其工作原理
- 参与社区:加入 PostgreSQL 社区,贡献代码或文档
- 认证考试:考虑 PostgreSQL 专业认证(如 PostgreSQL Certified Engineer)
记住,掌握数据库技能的关键在于持续实践和不断学习新技术。PostgreSQL 社区活跃,新功能不断加入,保持学习才能充分利用这个强大工具的全部潜力。
