首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 與 MongoDB 聚合查詢對照:相同業務邏雙語法實戰

     編輯:MySQL 資料庫相關知識

場景描述

查詢:分數 > 0 且人名為 bob 或 jake 的記錄,按人名分組,輸出總分、平均分、最小分、最大分、筆數。

MySQL 方案

-- 建表
CREATE TABLE demo (
  id INT PRIMARY KEY,
  person VARCHAR(45) NOT NULL,
  score INT NOT NULL
);

-- 插入測試資料
INSERT INTO demo VALUES
(1,'bob',50),(2,'jake',60),(3,'bob',100),(6,'jake',100),(8,'li',100);

-- 聚合查詢
SELECT person,
       SUM(score) AS total_score,
       AVG(score) AS avg_score,
       MIN(score) AS min_score,
       MAX(score) AS max_score,
       COUNT(*)   AS cnt
FROM demo
WHERE score > 0 AND person IN ('bob','jake')
GROUP BY person;

MongoDB 方案(聚合管線)

// 集合結構
{ _id: ObjectId, person: String, score: Number }

// 聚合管線
db.demo.aggregate([
  { $match: { score: { $gt: 0 }, person: { $in: ['bob','jake'] } } },
  { $group: {
      _id: '$person',
      total_score: { $sum: '$score' },
      avg_score:   { $avg: '$score' },
      min_score:   { $min: '$score' },
      max_score:   { $max: '$score' },
      cnt:         { $sum: 1 }
  }}
])

結果對照

persontotal_scoreavg_scoremin_scoremax_scorecnt
bob15075501002
jake16080601002

核心對應關係

SQL 子句MongoDB 階段說明
WHERE$match過濾文檔
GROUP BY$group分組聚合
SUM/AVG/MIN/MAX/COUNT$sum/$avg/$min/$max/$sum:1聚合運算子
SELECT 別名_id 欄位名輸出欄位命名

進階提示

  • MongoDB $match 應盡早放置,利用索引減少後續處理文檔數
  • 大數據集可加 { allowDiskUse: true } 避免記憶體溢出
  • MySQL 8.0+ 支援 CTE 與窗口函數,複雜報表查詢更優雅
  • 兩者皆支援 EXPLAIN 分析執行計畫

掌握雙語法對照,能在異構資料庫遷移、混合持久化架構中快速轉換思維。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved