PostgreSQL基操
常见数据库管理系统(DBMS) 对比表
| 数据库系统 | 类型 | 主要特点 | 适用场景 | 开源/商业 | 优势 | 劣势 |
|---|---|---|---|---|---|---|
| PostgreSQL | 关系型数据库 (RDBMS) | 标准SQL支持、扩展性强、支持GIS、JSON | Web应用、大数据分析、金融、电商 | 开源 | 功能最全的开源关系库,事务一致性强,扩展性好 | 写入性能比MySQL略弱,学习曲线较陡 |
| MySQL / MariaDB | 关系型数据库 (RDBMS) | 易用、读写性能高、生态广 | Web系统、CMS、OLTP | 开源(MySQL有商业版) | 部署简单、社区庞大、性能优良 | 高级功能(如窗口函数)支持较晚,复杂SQL性能不如Postgres |
| Oracle Database | 关系型数据库 (RDBMS) | 强大的事务处理、分布式、容灾能力 | 银行、电信、ERP、核心业务系统 | 商业 | 企业级特性最丰富,稳定性强 | 授权费用高、闭源 |
| Microsoft SQL Server | 关系型数据库 (RDBMS) | 与Windows生态整合好,BI工具丰富 | 企业内部系统、办公系统 | 商业 | 易与微软产品集成,管理工具友好 | 跨平台支持有限,费用高 |
| MongoDB | 文档型 NoSQL | JSON文档存储、灵活schema、水平扩展 | 大数据、日志存储、物联网 | 开源(有商业支持) | 数据模型灵活,横向扩展好 | 不适合强一致性事务型系统 |
| Redis | 内存型 NoSQL | Key-Value存储、极高性能、支持持久化 | 缓存、实时统计、消息队列 | 开源 | 毫秒级响应,适合高并发 | 数据量过大时成本高,不适合作为主库 |
| Cassandra | 列式 NoSQL | 去中心化、强大的分布式扩展性 | 大规模日志、物联网、大数据分析 | 开源 | 高可用、无单点故障,水平扩展优越 | 查询语法有限,不适合复杂关 |
- 如果你偏向 开源关系型数据库,推荐 PostgreSQL 和 MySQL/MariaDB。
- 如果你偏向 企业级高可用系统,推荐 Oracle 或 SQL Server。
- 如果你需要 灵活/大数据/高并发,考虑 MongoDB、Redis、Cassandra。
为什么有人选 MySQL,有人选 PostgreSQL?
1、选择 MySQL 的原因
- 上手快、生态成熟
- 轻量级 Web 应用多
- 开发者熟悉度高(PHP、Java Web 常见)
- 云服务和托管服务支持广
2、选择 PostgreSQL 的原因
- 功能更强大,SQL 更接近标准
- 更适合复杂查询、大数据分析
- 对数据一致性要求高(金融、政企)
- JSONB + 关系型结合,能当 混合数据库 用
- 开源独立,不受 Oracle 掌控
一、什么是 PostgreSQL
- PostgreSQL(简称 PG)是一个 开源的关系型数据库管理系统(RDBMS)。
- 它的特点是:功能强大、遵循 SQL 标准、支持高度扩展。
- 有时被称为 “世界上最先进的开源数据库”。
主要特性:
- 事务支持完整(ACID)
- 复杂 SQL 能力强(窗口函数、递归查询、CTE 等)
- 支持 JSON/NoSQL(可以当作文档数据库用)
- 高度可扩展(可以自定义函数、类型、索引方法)
- 社区开源,不属于某家公司(MySQL 属于 Oracle)
二、连接与基本操作(命令行)
2.1 连接数据库
psql -U 用户名 -d 数据库名
2.2 指定主机和端口
psql -h 127.0.0.1 -p 5432 -U postgres -d chatbi
2.3 执行脚本文件
psql -U postgres -d chatbi -f data.sql > log.txt 2>&1
二、psql 内部命令
(以反斜杠 \ 开头)
| 命令 | 作用 |
|---|---|
\l | 列出所有数据库 |
\c 数据库名 | 切换数据库 |
\dn | 列出所有 schema |
\dt | 列出当前 schema 的表 |
\dt schema.* | 列出指定 schema 的表 |
\d 表名 | 查看表结构 |
\d+ 表名 | 查看表结构和存储信息 |
\di | 查看索引 |
\dv | 查看视图 |
\df | 查看函数 |
\du | 查看所有用户 |
\x | 切换扩展显示(结果纵向展示) |
\o 文件路径 | 将输出写入文件(再用 \o 关闭) |
\i 文件路径 | 执行脚本文件 |
\q | 退出 psql |
三、SQL 常用命令
-- 当前 schema
SHOW search_path;-- 设置默认 schema
SET search_path TO chatbi;-- 查看当前用户
SELECT current_user;-- 查看当前数据库
SELECT current_database();-- 查询前 10 行
SELECT * FROM 表名 LIMIT 10;-- 插入数据
INSERT INTO 表名 (col1, col2) VALUES ('a', 'b');-- 更新数据
UPDATE 表名 SET col1 = 'new' WHERE id = 1;-- 删除数据
DELETE FROM 表名 WHERE id = 1;-- 创建备份表
CREATE TABLE 表名_backup AS SELECT * FROM 表名;
3.1 Database与Schema
PostgreSQL 里有两个层级
数据库(Database)
- 就像一个大的“文件夹”。
- 每个数据库是相互独立的,里面的表、函数、数据彼此隔离。
- 你连接时用
\c 数据库名,就是切换到另一个文件夹。
👉 一个 PostgreSQL 实例里可以有很多数据库,比如:
chatbipostgrestestdb
- 模式(Schema)
- 数据库里面还可以再分“子文件夹”,这就是 schema。
- schema 用来组织表(tables)、视图(views)、函数等对象。
- 你可以有多个 schema,例如:
- 在
chatbi数据库中:有public、chatbi、logs等 schema。
- 在
- 表的全名写法是:
schema.table,比如:chatbi.users。
两个命令的区别
\c chatbi👉 切换到 chatbi 数据库(一个大的文件夹)。
SET search_path TO chatbi;👉 在 当前数据库 里,告诉 SQL 引擎:如果我写
SELECT * FROM users;,默认去chatbi.users查,而不是public.users。(只是在数据库里换“默认子文件夹”而已,没有跳到别的数据库。)
举例
假设 PostgreSQL 里有:
- 数据库:
chatbi- 模式:
public、chatbi- 表:
public.users、chatbi.users
- 表:
- 模式:
如果你连接进去:
psql -U postgres -d chatbi
不设置 search_path:
SELECT * FROM users;→ 默认会查
public.users。设置 search_path:
SET search_path TO chatbi; SELECT * FROM users;→ 现在会查
chatbi.users。切换数据库:
\c postgres→ 你现在已经跳到 另一个数据库 了,前面那个
chatbi数据库里的表就完全看不到了。
✅ 总结一句话:
- \c:换数据库(大文件夹)。
- SET search_path:换 schema(小文件夹),只在当前数据库里有效。
四、实用技巧
执行 SQL 文件并保存日志
psql -U postgres -d chatbi -f data.sql > run.log 2>&1只导出数据到 CSV
\copy 表名 TO '/tmp/表名.csv' CSV HEADER;从 CSV 导入数据
\copy 表名 FROM '/tmp/表名.csv' CSV HEADER;
这份速查表涵盖了 连接库 → 浏览库结构 → 操作表 → 备份/导入导出 → 日志保存 的常见需求。
4.1 保存SQL 的执行结果日志
在 psql 里:
\o /home/0905log.txt
\i /data/chatbi.txt
\o
\o 只会捕获 SQL 的执行结果(查询结果、确认信息),不会捕获 psql 客户端本身的错误输出。
- 比如
SELECT * FROM 表;的结果会进日志 - 但如果表不存在导致
ERROR: relation "表" does not exist,这个报错信息默认走 stderr,不会写进\o
用 \i 加 \o 的方式执行,那错误信息只能显示在屏幕,不会进文件
4.2 保存所有输出(推荐)
在 shell 里执行
psql -U postgres -d chatbi -f chatbi.txt > /home/0905log.txt 2>&1
>保存标准输出(stdout)2>&1把错误输出(stderr)也一起写入文件这样结果和报错都会写进
0905log.txt
