跳至主要内容

SQL 與 MongoDB 指令與術語對照關係

術語與概念對照

以下是常見的 SQL 與 MongoDB 術語對照,包含中文和英文的對應說明:

SQL 術語/概念MongoDB 術語/概念
資料庫 (database)資料庫 (database)
資料表 (table)集合 (collection)
資料列 (row)文件 (document) 或 BSON 文件
欄位 (column)欄位 (field)
索引 (index)索引 (index)
資料表聯結 (table joins)$lookup 嵌入式文件 (embedded documents)
主鍵 (primary key)_id(自動設為主鍵)
聚合 (aggregation)(例如 GROUP BYaggregation pipeline
SELECT INTO NEW_TABLE$out
MERGE INTO TABLE$merge
UNION ALL$unionWith
transactionstransactions

可執行檔對照

資料庫的可執行檔是用來啟動資料庫伺服器或與資料庫互動的工具。以下是不同資料庫的伺服器和客戶端可執行檔對應:

MongoDBMySQLOracleInformix (IDS)DB2
伺服器 (Database Server)mongodmysqldoracleIDSDB2 Server
客戶端 (Database Client)mongoshmysqlsqlplusDB-AccessDB2 Client
  • 伺服器 (Database Server):如 mongod,是用來啟動 MongoDB 資料庫伺服器的可執行檔,類似於 MySQL 的 mysqld
  • 客戶端 (Database Client):如 mongosh,是一個命令列工具,用來與 MongoDB 資料庫互動,執行查詢及管理操作。

查詢資料 (SELECT 與 find) 指令對照

MongoDB 的 find 方法與 SQL 的 SELECT 類似,用來從集合中查詢文件。MongoDB 提供了強大的查詢功能,可以結合查詢操作符(如 $gt, $eq)來篩選結果。

相關連結:

查詢所有資料

-- SQL
SELECT * FROM people;
// MongoDB
db.people.find();

說明:這會查詢 people 表/集合中的所有資料。

查詢特定欄位

-- SQL
SELECT user_id, status FROM people;
// MongoDB
db.people.find({}, { user_id: 1, status: 1 });

說明:只查詢 user_idstatus 欄位。

使用條件查詢

-- SQL
SELECT * FROM people WHERE age > 30;
// MongoDB
db.people.find({ age: { $gt: 30 } });

說明:查詢所有 age 大於 30 的記錄。在 MongoDB 中,$gt 表示「大於」。

查詢特定條件的資料

-- SQL
SELECT * FROM people WHERE status = 'A';
// MongoDB
db.people.find({ status: 'A' });

說明:查詢 status'A' 的所有資料。

計算資料筆數

-- SQL
SELECT COUNT(*) FROM people;
// MongoDB
db.people.countDocuments();

說明:計算 people collection 中的 document 數量。

插入資料 (INSERT 與 insertOne) 指令對照

MongoDB 使用 insertOneinsertMany 來插入文件到集合中,與 SQL 不同的是,MongoDB 不需要事先定義資料結構,_id 自動作為主鍵生成。。

相關連結:

插入新資料

-- SQL
INSERT INTO people (user_id, age) VALUES ('abc123', 55);
// MongoDB
db.people.insertOne({ user_id: 'abc123', age: 55 });

說明:在 MongoDB 中,插入文件時會自動生成 _id 作為主鍵。

更新資料 (UPDATE 與 updateMany) 指令對照

MongoDB 使用 updateOneupdateMany 來更新文件,並透過 $set 來修改欄位的值,或是使用 $inc 來遞增數值。

更新特定欄位

-- SQL
UPDATE people SET age = 30 WHERE user_id = 'abc123';
// MongoDB
db.people.updateMany({ user_id: 'abc123' }, { $set: { age: 30 } });

說明:更新所有 user_id'abc123' 的文件,將 age 設為 30。

刪除資料 (DELETE 與 deleteMany) 指令對照

在 MongoDB 中,deleteOnedeleteMany 用來刪除符合條件的文件,與 SQL 的 DELETE 操作相似。

相關連結:

刪除符合條件的資料

-- SQL
DELETE FROM people WHERE status = 'A';
// MongoDB
db.people.deleteMany({ status: 'A' });

說明:刪除所有 status'A' 的文件。

刪除所有資料

-- SQL
DELETE FROM people;
// MongoDB
db.people.deleteMany({});

說明:刪除 people 集合中的所有文件。

聚合查詢與資料轉換指令對照

在 SQL 中,GROUP BYUNION ALL 等聚合查詢是常見的操作。MongoDB 則使用 Aggregation Pipeline 來實現複雜的資料處理,透過管道方式逐步處理文件,最終輸出結果。

SQL 操作MongoDB 聚合操作
群組(GROUP BY)$group
聯集(UNION ALL)$unionWith
篩選條件(HAVING)$match(在 $group 之後使用)
排序(ORDER BY)$sort
限制筆數(LIMIT)$limit
跳過筆數(OFFSET)$skip
選擇至新表格(SELECT INTO NEW_TABLE)$out
合併至表格(MERGE INTO TABLE)$merge
計算總和(SUM)$sum
計算平均值(AVG)$avg
計算筆數(COUNT)$count
取得最小值(MIN)$min
取得最大值(MAX)$max
唯一值(DISTINCT)$group$addToSet

以下是一些常見 SQL 與 MongoDB 聚合查詢的範例

計算總數

-- SQL
SELECT COUNT(*) AS count FROM orders;
// MongoDB
db.orders.aggregate([
{
$group: {
_id: null,
count: { $sum: 1 }
}
}
]);

說明:計算 orders 集合中的文件總數。

計算欄位總和

-- SQL
SELECT SUM(price) AS total FROM orders;
// MongoDB
db.orders.aggregate([
{
$group: {
_id: null,
total: { $sum: "$price" }
}
}
]);

說明:計算 orders 集合中 price 欄位的總和。

分組計算總和

-- SQL
SELECT cust_id, SUM(price) AS total FROM orders GROUP BY cust_id;
// MongoDB
db.orders.aggregate([
{
$group: {
_id: "$cust_id",
total: { $sum: "$price" }
}
}
]);

說明:根據 cust_id 分組,計算每個客戶的 price 總和。

分組計算並排序

-- SQL
SELECT cust_id, SUM(price) AS total FROM orders GROUP BY cust_id ORDER BY total;
// MongoDB
db.orders.aggregate([
{
$group: {
_id: "$cust_id",
total: { $sum: "$price" }
}
},
{
$sort: { total: 1 }
}
]);

說明:根據 cust_id 分組計算 price 總和,並按總和排序。

分組計算並格式化日期

-- SQL
SELECT cust_id, ord_date, SUM(price) AS total FROM orders GROUP BY cust_id, ord_date;
// MongoDB
db.orders.aggregate([
{
$group: {
_id: {
cust_id: "$cust_id",
ord_date: { $dateToString: { format: "%Y-%m-%d", date: "$ord_date" } }
},
total: { $sum: "$price" }
}
}
]);

說明:根據 cust_idord_date 分組,計算 price 總和,並忽略時間部分。

分組後過濾筆數

-- SQL
SELECT cust_id, COUNT(*) FROM orders GROUP BY cust_id HAVING COUNT(*) > 1;
// MongoDB
db.orders.aggregate([
{
$group: {
_id: "$cust_id",
count: { $sum: 1 }
}
},
{
$match: { count: { $gt: 1 } }
}
]);

說明:返回有多筆記錄的 cust_id 及對應的記錄數量。

多重條件分組計算

-- SQL
SELECT cust_id, ord_date, SUM(price) AS total FROM orders GROUP BY cust_id, ord_date HAVING total > 250;
// MongoDB
db.orders.aggregate([
{
$group: {
_id: {
cust_id: "$cust_id",
ord_date: { $dateToString: { format: "%Y-%m-%d", date: "$ord_date" } }
},
total: { $sum: "$price" }
}
},
{
$match: { total: { $gt: 250 } }
}
]);

說明:根據 cust_idord_date 分組計算 price 總和,只返回總和大於 250 的結果。

Reference