Calvert's murmur

SQL 及 MongoDB 基本指令對應表

2013-11-14

約 12705 字 / 需 70 分鐘閱讀

由於新專案採用了 Node.js 開發且使用 MongoDB 作為儲存媒介,所以動手翻譯了官方文件方便查閱相關指令用法。

術語和概念(Terminology and Concepts)

下表列出了各種 SQL 和相應的 MongoDB 的術語和概念。
SQL 術語/概念 MongoDB 術語/概念
資料庫(database) 資料庫(database)
資料表(table) 集合(collection)
資料列(row) 文件(document) 或 BSON 文件
資料行(column) 欄位(field)
索引(index) 索引(index)
資料表連結(table joins) 嵌入式文件及連結(embedded documents and linking)
主索引鍵(primary key)

指定任意一個或多個欄位組合為主索引鍵,資料內容須唯一不可重複。
主索引鍵(primary key)

在 MongoDB,主索引鍵會自動設定到 _id 欄位。
彙總(aggregation),例如:group by 彙總管線(aggregation pipeline)

參閱 SQL 至彙總(Aggregation)對應表.

可執行檔案(Executables)

下表列出了 MySQL / Oracle 可執行檔案和相應的 MongoDB 的可執行檔案。
MySQL / Oracle MongoDB
資料庫伺服器(Database Server) mysqld / oracle mongod
資料庫用戶端(Database Client) mysql / sqlplus mongo

範例(Examples)

下表列出了各種 SQL 語句和相應的 MongoDB 語句。在表格中的範例假定有下列條件:
  • SQL 範例假設是名為 users 的資料表

  • MongoDB 範例假設是名為 users 的集合,包含的文件原型如下:

    {
      _id: ObjectID("509a8fb2f3f4948bd2f983a0"),
      user_id: "abc123",
      age: 55,
      status: 'A'
    }

建立及修改資料表(Create and Alter)

下面列出了關於資料表層級操作的各種 SQL 語句和相應的 MongoDB 語句。

  • SQL 架構語句

    CREATE TABLE users (
     id MEDIUMINT NOT NULL
      AUTO_INCREMENT,
     user_id Varchar(30),
     age Number,
     status char(1),
     PRIMARY KEY (id)
    )
  • MongoDB 架構語句
    在第一次插入資料操作時透過隱含方式建立。若未指定 _id 欄位,則會自動建立主索引鍵 _id。

    db.users.insert( {
     user_id: "abc123",
     age: 55,
     status: "A"
     } )

    然而,你也可以明確地建立一個集合:

    db.createCollection("users")
  • 參閱 insert()db.createCollection() 取得更多資訊。


  • SQL 架構語句

    ALTER TABLE users
    ADD join_date DATETIME
  • MongoDB 架構語句
    集合不描述或強制其文件結構,即在集合層級沒有結構上的改變。
    然而,在文件層級,update() 操作可以透過 $set 運算元加入欄位到已存在的文件。

    db.users.update(
     { },
     { $set: { join_date: new Date() } },
     { multi: true }
    )
  • 參閱 Data Modeling Conceptsupdate()$set 取得更多改變集合中文件結構的更多資訊。


  • SQL 架構語句

    ALTER TABLE users
    DROP COLUMN join_date
  • MongoDB 架構語句
    集合不描述或強制其文件結構,即在集合層級中沒有結構上的改變。
    然而,在文件層級,update() 操作可以透過 $unset 運算元從文件移除欄位。

    db.users.update(
     { },
     { $unset: { join_date: "" } },
     { multi: true }
    )
  • 參閱 Data Modeling Conceptsupdate()$unset 取得更多改變集合中文件結構的更多資訊。


  • SQL 架構語句

    CREATE INDEX idx_user_id_asc
    ON users(user_id)
  • MongoDB 架構語句

    db.users.ensureIndex( { user_id: 1 } )
  • 參閱 ensureIndex()indexes 取得更多資訊。


  • SQL 架構語句

    CREATE INDEX
     idx_user_id_asc_age_desc
    ON users(user_id, age DESC)
  • MongoDB 架構語句

    db.users.ensureIndex( { user_id: 1, age: -1 } )
  • 參閱 ensureIndex()indexes 取得更多資訊。


  • SQL 架構語句

    DROP TABLE users
  • MongoDB 架構語句

    db.users.drop()
  • 參閱 drop() 取得更多資訊。

插入(Insert)

下面列出了關於插入資料到資料表的各種 SQL 語句和相應的 MongoDB 語句。

  • SQL 架構語句

    INSERT INTO users(
     user_id,
     age,
     status)
    VALUES (
     "bcd001",
     45,
     "A")
  • MongoDB 架構語句

    db.users.insert( {
     user_id: "bcd001",
     age: 45,
     status: "A"
    } )
  • 參閱 insert() 取得更多資訊。

選擇(Select)

下面列出了關於從資料表讀取資料的各種 SQL 語句和相應的 MongoDB 語句。

  • SQL 架構語句

    SELECT *
    FROM users
  • MongoDB 架構語句

    db.users.find()
  • 參閱 find() 取得更多資訊。


  • SQL 架構語句

    SELECT id, user_id, status
    FROM users
  • MongoDB 架構語句

    db.users.find(
     { },
     { user_id: 1, status: 1 }
    )
  • 參閱 find() 取得更多資訊。


  • SQL 架構語句

    SELECT user_id, status
    FROM users
  • MongoDB 架構語句

    db.users.find(
     { },
     { user_id: 1, status: 1, _id: 0 }
    )
  • 參閱 find() 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    WHERE status = "A"
  • MongoDB 架構語句

    db.users.find(
     { status: "A" }
    )
  • 參閱 find() 取得更多資訊。


  • SQL 架構語句

    SELECT user_id, status
    FROM users
    WHERE status = "A"
  • MongoDB 架構語句

    db.users.find(
     { status: "A" },
     { user_id: 1, status: 1, _id: 0 }
    )
  • 參閱 find() 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    WHERE status != "A"
  • MongoDB 架構語句

    db.users.find(
     { status: { $ne: "A" } }
    )
  • 參閱 find()$ne 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    WHERE status = "A"
    AND age = 50
  • MongoDB 架構語句

    db.users.find(
     { status: "A",
      age: 50 }
    )
  • 參閱 find()$and 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    WHERE status = "A"
    OR age = 50
  • MongoDB 架構語句

    db.users.find(
     { $or: [ { status: "A" } ,
           { age: 50 } ] }
    )
  • 參閱 find()$or 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    WHERE age > 25
  • MongoDB 架構語句

    db.users.find(
     { age: { $gt: 25 } }
    )
  • 參閱 find()$gt 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    WHERE age < 25
  • MongoDB 架構語句

    db.users.find(
     { age: { $lt: 25 } }
    )
  • 參閱 find()$lt 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    WHERE age > 25
    AND  age <= 50
  • MongoDB 架構語句

    db.users.find(
     { age: { $gt: 25, $lte: 50 } }
    )
  • 參閱 find()$gt$lte 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    WHERE user_id like "%bc%"
  • MongoDB 架構語句

    db.users.find(
     { user_id: /bc/ }
    )
  • 參閱 find()$regex 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    WHERE user_id like "bc%"
  • MongoDB 架構語句

    db.users.find(
     { user_id: /^bc/ }
    )
  • 參閱 find()$regex 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    WHERE status = "A"
    ORDER BY user_id ASC
  • MongoDB 架構語句

    db.users.find( { status: "A" } ).sort( { user_id: 1 } )
  • 參閱 find()sort() 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    WHERE status = "A"
    ORDER BY user_id DESC
  • MongoDB 架構語句

    db.users.find( { status: "A" } ).sort( { user_id: -1 } )
  • 參閱 find()sort() 取得更多資訊。


  • SQL 架構語句

    SELECT COUNT(*)
    FROM users
  • MongoDB 架構語句

    db.users.count()

    db.users.find().count()
  • 參閱 find()count() 取得更多資訊。


  • SQL 架構語句

    SELECT COUNT(user_id)
    FROM users
  • MongoDB 架構語句

    db.users.count( { user_id: { $exists: true } } )

    db.users.find( { user_id: { $exists: true } } ).count()
  • 參閱 find()count()$exists 取得更多資訊。


  • SQL 架構語句

    SELECT COUNT(*)
    FROM users
    WHERE age > 30
  • MongoDB 架構語句

    db.users.count( { age: { $gt: 30 } } )

    db.users.find( { age: { $gt: 30 } } ).count()
  • 參閱 find()count()$gt 取得更多資訊。


  • SQL 架構語句

    SELECT DISTINCT(status)
    FROM users
  • MongoDB 架構語句

    db.users.distinct( "status" )
  • 參閱 find()distinct() 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    LIMIT 1
  • MongoDB 架構語句

    db.users.findOne()

    db.users.find().limit(1)
  • 參閱 find()findOne()limit() 取得更多資訊。


  • SQL 架構語句

    SELECT *
    FROM users
    LIMIT 5
    SKIP 10
  • MongoDB 架構語句

    db.users.find().limit(5).skip(10)
  • 參閱 find()limit()skip() 取得更多資訊。


  • SQL 架構語句

    EXPLAIN SELECT *
    FROM users
    WHERE status = "A"
  • MongoDB 架構語句

    db.users.find( { status: "A" } ).explain()
  • 參閱 find()explain() 取得更多資訊。

修改資料(Update Records)

下面列出了關於修改現有資料表內資料的各種 SQL 語句和相應的 MongoDB 語句。

  • SQL 架構語句

    UPDATE users
    SET status = "C"
    WHERE age > 25
  • MongoDB 架構語句

    db.users.update(
     { age: { $gt: 25 } },
     { $set: { status: "C" } },
     { multi: true }
    )
  • 參閱 update()$gt$set 取得更多資訊。


  • SQL 架構語句

    UPDATE users
    SET age = age + 3
    WHERE status = "A"
  • MongoDB 架構語句

    db.users.update(
     { status: "A" } ,
     { $inc: { age: 3 } },
     { multi: true }
    )
  • 參閱 update()$inc$set 取得更多資訊。

刪除資料(Delete Records)

下面列出了關於從資料表刪除資料的各種 SQL 語句和相應的 MongoDB 語句。

  • SQL 架構語句

    DELETE FROM users
    WHERE status = "D"
  • MongoDB 架構語句

    db.users.remove( { status: "D" } )
  • 參閱 remove() 取得更多資訊。


  • SQL 架構語句

    DELETE FROM users
  • MongoDB 架構語句

    db.users.remove( )
  • 參閱 remove() 取得更多資訊。

參考資料:SQL to MongoDB Mapping Chart