このページでは、 SQL Interface がユーザーまたはツールからSQL を検索し、それらのステートメントをMQL (MongoDBクエリ言語)に変換するSQLのダイアレクトである MongoDB の構文とセマンティクスについて説明します。このページでは、サポートされている句、演算子、式、関数を一覧表示して説明します。
互換性と制限
MongoSQL はSQL-92 標準に基づいています。ただし、次の制限があるため、MongoDB は完全にSQL-92 と互換性がありません。
dateデータ型はサポートされていません。代わりにtimestampを使用してください。間隔および日付間隔の算術演算はサポートされていません。
MongoDB はMongoDB ベクトル検索とMongoDB Search をサポートしていません。
タイプ システム
データ型
MongoSQL データ型は、BSON型 のセットです。MongoSQL ではこれらすべての型をクエリできます。これらは次のとおりです。
string (
STRING)ドキュメント(
DOCUMENT)配列(
ARRAY)BinData (
BINDATA)ObjectId (
OBJECTID)ブール値(
BOOL)日付(
TIMESTAMP)null(
NULL)正規表現(
REGEX)32 ビット整数(
INT)double (
DOUBLE)Long (
LONG)タイムスタンプ(
BSON_TIMESTAMP)小数(
DECIMAL)MinKey(
MINKEY)MaxKey(
MAXKEY)DBPointer(
DBPOINTER)シンボル(
SYMBOL)JavaScriptとスコープ(
JAVASCRIPTWITHSCOPE)JavaScript(
JAVASCRIPT)
MongoSQL の各型には名前(上記の括弧内)があります。これは、CAST のような式など、必要に応じて型を参照ために使用できるキーワードです。
タイプの変換
明示的な型変換は CAST 関数または :: 演算子を使用して表現されます。数値型はすべて相互に同等です。 MongoSQL では、オペランドを同じ数値型にキャストすることなく、さまざまな数値型間で操作を実行できます。
Schemas
MongoSQL は、スキーマを使用して MongoDB の柔軟なドキュメント値をタイプに変換します。MongoDB スキーマは、コンパイル時に true であることが確認されている式またはコレクションに関するファセットのコレクションです。
例、MongoDBスキーマは、式がブールブール値またはサブフィールドを持つドキュメントのいずれかであること、または式が長さが1の配列または正の整数であることを指定できます。
静的型制約が満たされない場合、クエリはコンパイルされません。
OnPremise 手動ツールと Atlas 自動ツールではスキーマ管理が異なります。
句
MongoSQL クエリは、 SQL句の基本セットをサポートしています。使用可能な 句は次のとおりです。
SELECTFROMWHEREGROUP BYHAVINGORDER BYOFFSETLIMITSELECT
SELECT は、すべての Atlas SQLクエリを開始します。MongoSQL では、SELECT VALUE と SELECT VALUES をどちらも使用できます。
MongoDB では、エイリアスが存在するためにネストされた SELECT ステートメントが必要です。
SELECT foo FROM (SELECT bar FROM baz) as subSelect
SELECT SELECT
結果セットから重複行を除外するには、SELECT DISTINCT を使用します。重複チェックはMongoDB の等価セマンティクスに従います。ここでは、ドキュメント比較にはフィールド順序が重要で、配列比較には要素順序と値の両方が重要です。
SELECT DISTINCT bar FROM baz
CAST()
MongoSQL は CAST() 関数をサポートしています。これを使用すると、クエリ内の値を特定のデータ型に動的に変換できます。
SELECT * FROM table WHERE period_start_utc >= CAST('2023-01-01T00:00:00.000Z' AS TIMESTAMP)
from
FROM は、すべての MongoDB クエリで評価される最初の句です。
FROM は、コレクション(SELECT * FROM foo) 、配列(SELECT * FROM [{'a': 1}]) 、結合(SELECT * FROM a JOIN b) 、 派生テーブル(SELECT * FROM (SELECT a FROM foo) d) 、 FLATTEN と UNIX などのさまざまなソースからデータを取得できます。
WHERE
WHERE句は受信データのフィルタです。 その式は静的にタイプBOOLまたはNULLである必要があり、 MISSINGと評価される可能性があります。
グループ化基準:
GROUP BY データをグループ化および集計するための手段を提供します。
FLATTEN または UNIXを使用してフラット化されたフィールドでGROUP BYを使用する場合は、エイリアスが必要です。
SELECT customerAge, COUNT(*) FROM Sales GROUP BY customer.age AS customerAge
集計関数
MongoSQL は次の集計関数をサポートしています。
名前 | 説明 | ノート |
|---|---|---|
| 引数を配列の末尾にプッシュします。 この関数の合計出力は配列になります。 |
|
| 重複を排除する配列の末尾に引数をプッシュします。 この関数の合計出力は、重複する項目がすべて削除された配列になります。 重複は |
|
| すべての引数の平均を返します。 | 引数は数値型に静的に型指定する必要があります。 |
| 要素の数をカウントします。 |
|
| グループの最初の要素を返します。 | 入力に決定的な順序がある場合にのみ決定的であり、それ以外は未定義です。 |
| グループの最初の要素を返します。 入力に決定的な順序がある場合にのみ決定的であり、それ以外は未定義です。 |
|
| MongoSQL |
|
| ドキュメントを連続してマージして作成されたドキュメントを返します。前の要素は左側として使用されます。 重複キーの場合、新しい要素内のキーの値は保持されます。 | 引数は静的に |
| MongoSQL |
|
| グループ全体にわたるすべての要素の標準偏差を返します。 | 引数は数値型に静的に型指定する必要があります。 See stdDevPop. |
| グループ内のすべての要素のサンプルの標準偏差を返します。 stdDevPop を参照してください。 | 引数は数値型に静的に型指定する必要があります。 |
| すべての引数の合計を返します。 | 引数は数値型に静的に型指定する必要があります。 |
HAVING
HAVING句はWHERE句と同じように動作しますが、 GROUP BY句の後に動作します。 WHERE句と同様に、 HAVING句は静的にBOOLタイプまたはNULLタイプである必要があり、 MISSINGと評価される可能性がある 式 を使用します。 GROUP BYで定義されたエイリアスを参照し、集計関数を持つ式を含めることができます。 GROUP BYで定義されたエイリアスのみがHAVING句で使用できます。
並び替え基準:
ORDER BY句は、1 つ以上のソートキーで結果セットを並べ替える方法を提供します。 各ソートキーは、列参照、または選択された式リスト内の位置によりSELECT式を参照する整数リテラルのいずれかになります。 列参照であるソートキーは、複合識別子にすることができます。 これらの複合識別子は、データソース名で修飾したり、ドキュメント サブフィールドを参照したりできます。
MongoSQL は、MISSING を NULL の前にソートし、NULL を他のすべての値の前にソートします。ORDER BY 句では、ソートキー式内のすべての可能な値が、>(より大きい)および <(より小さい)演算子によって同等であることが静的に検証される必要があります。
制限とオフセット
LIMITおよびOFFSET句を使用すると、ユーザーはクエリによって返された行の一部のみを取得できます。 LIMITという数値が指定された場合、その行数以上の行は返されません。 OFFSET数値が指定されている場合、その行数は行を返す前にスキップされます。
LIMITとOFFSETの数値はいずれも正の整数である必要があります。 なしでLIMIT またはOFFSET ORDER BYを使用しても、同じ結果は保証されません。
LIMITとOFFSETの両方が設定されている場合、結果の残りを返す前にOFFSET行がスキップされます。この行には、 LIMIT桁の行以下が含まれる必要があります。
LIMIT i, j はLIMIT i OFFSET jの短縮形です。
LIMIT とOFFSETはサブクエリで使用できます。
セット操作
UNION と UNION ALL のセット演算子は、2 つの SELECT クエリに対して 1 つの結果セットを返します。UNION 演算子は結果セットから重複行を削除しますが、UNION ALL 演算子は結果セットから重複行を削除しません。これらの演算子によって返される結果セットには、定義された順序はありません。
MongoSQL は INTERSECT または EXCEPT セット操作をサポートしていません。
式
Identifiers
MongoSQL の識別子は、データベース、テーブル、列を参照します。MongoSQL 識別子は、null 文字 \x00 を除くすべての UTF-8 文字をサポートしています。
MongoSQL では、他のセマンティック意味を持つ文字との競合を避けるために、一部の識別子は制限されています。このような文字を識別子に含めるには、二重引用符またはバッククションで囲むなどの条件を満たす必要があります。例、識別子は数字で始まる場合、または予約済みのキーワードと競合する場合(例:"10cent")。識別子は、区切り文字が含まれているかどうかにかかわらず、大文字と小文字を区別します。
Aliases
MongoSQL では、識別子はすべてのエイリアスに使用されます。ほとんどの場合、エイリアスが同じ句で複数回使用されると、MongoDB はエラーを返します。ただし、UNION ALL の両方でエイリアスを繰り返すことができることを除きます。これは、自動生成エイリアスにも適用されます。
Keywords
MongoDB キーワード(SELECT、FROM、JOIN など)は、区切り文字以外の識別子として使用できません。
リテラル
MongoSQL は、ブール値、null、数値、string のリテラルをサポートしています。stringは一重引用符で囲みます。文字列リテラルに一重引用符を含めるには、二重引用符('o''clock')にします。
リテラル整数は、 32ビットの符号付き整数範囲内にある場合はINTと入力され、それ以外の場合はLONGと入力されます。 リテラル浮動小数点数または科学表記数のタイプはDOUBLEです。
注意
MongoSQL は、拡張JSONでエンコードされた文字列を対応する型への暗黙的な型変換をサポートしています。MongoSQL はすべてのBSON型をサポートしており、すべてのBSON型は拡張JSONとして表現できるため、クエリに任意の型のリテラル値を含めることができます。 つまり、式が必要な場所に拡張JSON string 値を含めることができ、MongoDB は対応するリテラル型に自動的に変換します。例、SELECT
'{"$numberInt": "1"}' + 2 FROM foo は SELECT 1 + 2 FROM foo を と解釈します。これは、日時リテラルに特に有用です。例、SELECT * FROM
foo WHERE myDate > '{"$date": "1995-06-28T03:05:00.000Z"}'。
リテラル値を書き込むには、CAST() 関数(またはその短縮演算子 ::)の代わりに、暗黙的な拡張 JSON を使用することをお勧めします。例、クエリにリテラルの日時値を含めるには、CAST('1995-06-28T03:05:00.000Z' AS TIMESTAMP) は推奨しません。CAST() または :: の使用は有効であり、機能しますが、特に WHERE 句で使用される場合、パフォーマンスに悪影響が及ぶ可能性があります。拡張JSON暗黙的な変換では、 パフォーマンスに影響が生じます 。
型の安全性を確保し、あいまいさを避けたい場合は、WHERE 句で CAST() を使用することをお勧めします。
括弧付き式
括弧付き式は、括弧でグループ化された式です。インデックス演算子が存在する場合には常に、操作の順序を区別するために括弧(または同様のメカニズム)が必要になる場合があります。MongoDB には、+ や :: などのいくつかの挿入演算子があります。例、1 + 2 * 3 の値は 7、(1 + 2) * 3 の値は 9 です。
演算子
MongoSQL は次の基本演算子をサポートしています。
+-*/||<<=!===>>=BETWEENANDORNOT
サブクエリ式
サブクエリは、クエリ内の SQL クエリです。 サブクエリは、 式 を使用できる任意の場所で使用できます。
MongoSQL は、スカラー サブクエリとテーブル サブクエリをサポートします。スカラーサブクエリは、0 または 1 行と 1 列を含む結果セットを返します。リテラルまたは単一列の値が有効なほとんどの場所で使用できます。テーブル サブクエリは、0 個以上の行と 1 つ以上の列を返します。
ドキュメント式とフィールドアクセス式
ドキュメントは、 JSONオブジェクトと同様の構文で表すことができます。キーは string である必要があり、値はサポートされている任意のタイプにすることができます。ドキュメントフィールドにアクセスするために、MongoDB は「ドット」表記と「括弧」表記の 2 つのオプションをサポートしています。
ドット表記は、MongoDB 集計のフィールド アクセスに似ています。 たとえば、ドキュメントdocにフィールドfが含まれている場合、そのフィールドの値にアクセスするために式doc.fが使用されます。 括弧表記では、フィールド名を囲む角括弧( [と] )を使用して、その名前のフィールドにアクセスします。 たとえば、以前に説明されている同じドキュメントを考えてみましょう。そのフィールドの値にアクセスするにはdoc["f"]が使用されます。
null と欠落
BSON ではNULLとMISSINGを区別します。 NULLの場合、リテラル値NULLを持つフィールドが存在しますが、 MISSINGの場合では、このフィールドはなくなります。
コメント
コメントはクエリ内の文字のシーケンスであり、クエリの実行に影響ません。MongoSQL は標準のSQLコメントと C スタイルのブロックコメントの両方をサポートしています。
標準のSQLコメントは、 doubleダッシュで始まり、改行で終わります。
\-- This is a standard SQL comment
ブロックコメントは\*で始まり、 */の一致する出現で終わります。
\* This is a multiline comment */