常見數據庫管理系統(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

去中心化、強大的分佈式擴展性

大規模日誌、物聯網、大數據分析

開源

高可用、無單點故障,水平擴展優越

查詢語法有限,不適合複雜關

  • 如果你偏向 開源關係型數據庫,推薦 PostgreSQLMySQL/MariaDB
  • 如果你偏向 企業級高可用系統,推薦 OracleSQL Server
  • 如果你需要 靈活/大數據/高併發,考慮 MongoDBRedisCassandra

為什麼有人選 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 裏有兩個層級

  1. 數據庫(Database)
  • 就像一個大的“文件夾”。
  • 每個數據庫是相互獨立的,裏面的表、函數、數據彼此隔離。
  • 你連接時用 \c 數據庫名,就是切換到另一個文件夾。

一個 PostgreSQL 實例裏可以有很多數據庫,比如:

  • chatbi
  • postgres
  • testdb

  1. 模式(Schema)
  • 數據庫裏面還可以再分“子文件夾”,這就是 schema
  • schema 用來組織表(tables)、視圖(views)、函數等對象。
  • 你可以有多個 schema,例如:
  • chatbi 數據庫中:有 publicchatbilogs 等 schema。
  • 表的全名寫法是:schema.table,比如:chatbi.users

兩個命令的區別

  • \c chatbi 切換到 chatbi 數據庫(一個大的文件夾)。
  • SET search_path TO chatbi;當前數據庫 裏,告訴 SQL 引擎:如果我寫 SELECT * FROM users;,默認去 chatbi.users 查,而不是 public.users
    (只是在數據庫裏換“默認子文件夾”而已,沒有跳到別的數據庫。)

舉例

假設 PostgreSQL 裏有:

  • 數據庫:chatbi
  • 模式:publicchatbi
  • 表:public.userschatbi.users

如果你連接進去:

psql -U postgres -d chatbi
  1. 不設置 search_path:
SELECT * FROM users;

→ 默認會查 public.users

  1. 設置 search_path:
SET search_path TO chatbi;
SELECT * FROM users;

→ 現在會查 chatbi.users

  1. 切換數據庫:
\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