常見數據庫管理系統(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 內部命令
(以反斜槓 \ 開頭)
|
命令
|
作用
|
|
|
列出所有數據庫
|
|
|
切換數據庫
|
|
|
列出所有 schema
|
|
|
列出當前 schema 的表
|
|
|
列出指定 schema 的表
|
|
|
查看錶結構
|
|
|
查看錶結構和存儲信息
|
|
|
查看索引
|
|
|
查看視圖
|
|
|
查看函數
|
|
|
查看所有用户
|
|
|
切換擴展顯示(結果縱向展示)
|
|
|
將輸出寫入文件(再用 |
|
|
執行腳本文件
|
|
|
退出 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