Docs 菜单
Docs 主页
/
MongoDB Atlas
/ /

Atlas SQL 语言参考文档

在此页面上

  • 兼容性和限制
  • 类型系统
  • 数据类型
  • 类型转换
  • Schemas
  • 子句
  • SELECT
  • from
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER BY
  • LIMIT 和 OFFSET
  • 设置操作
  • 表达式
  • 标识符
  • Aliases
  • 关键字
  • 文字
  • 带括号的表达式
  • 操作符
  • 子查询表达式
  • 文档和字段访问表达式
  • 空值和缺失
  • 评论

本页概述了 Atlas SQL 的语法和语义,Atlas SQL 是一种 SQL 方言,旨在为使用 MongoDB 灵活的文档模型提供一流的支持。本页列出并描述了支持的子句、操作符、表达式和函数。

  • Atlas SQL 基于 SQL-92 标准。不过,由于以下限制,Atlas SQL 并不完全兼容 SQL-92:

    • 不支持 UNION函数。 但是,支持UNION ALL

    • 不支持date数据类型。 请改用timestamp

    • SELECT DISTINCT 不受支持。

    • 不支持间隔和日期间隔算术。

  • Atlas SQL不支持Atlas Vector Search和Atlas Search。

Atlas SQL数据类型是 的集合BSON types 。所有这些类型都可以在 Atlas SQL 中查询。 它们是:

  • string (STRING)

  • 文档 ( DOCUMENT )

  • 数组 ( ARRAY )

  • BinData ( BINDATA )

  • ObjectId (OBJECTID)

  • 布尔值 ( BOOL )

  • 日期 ( TIMESTAMP )

  • 空 ( NULL )

  • 正则表达式 ( REGEX )

  • 32 位整数 (INT)

  • 双精度 ( DOUBLE )

  • 长整型 ( LONG )

  • 时间戳 ( BSON_TIMESTAMP )

  • 十进制 ( DECIMAL )

  • MinKey ( MINKEY )

  • MaxKey ( MAXKEY )

  • DBPointer ( DBPOINTER )

  • 符号 ( SYMBOL )

  • 带作用域的JavaScript (JAVASCRIPTWITHSCOPE)

  • JavaScript ( JAVASCRIPT )

Atlas SQL中的每种类型都有一个名称(在上面的括号中),这是一个关键字,可在必要时用于引用该类型(例如在CAST这样的表达式中)。

显式类型转换通过CAST函数或::操作符表示。 数值类型都是相互可比较的; Atlas SQL 允许各种数值类型之间进行运算,而无需将操作数转换为相同的数值类型。

Atlas SQL使用模式将 MongoDB 的灵活文档值转换为类型。 Atlas SQL 模式是关于表达式或集合的事实集合,这些事实在编译时已知为 true。

例如,Atlas SQL 模式可能规定表达式是布尔值或带有子字段的文档,或者是长度为 1 或正整数的数组。

如果不满足静态类型约束,则查询将无法编译。

Atlas SQL 查询支持一组基本的 SQL 子句。可用的子句包括:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
OFFSET
LIMIT

SELECT 开始每个 Atlas SQL 查询。 Atlas SQL 允许SELECT VALUESELECT VALUES互换使用。

Atlas SQL需要嵌套的SELECT语句才能具有别名。

SELECT foo FROM (SELECT bar FROM baz) as subSelect

Atlas SQL支持CAST()函数,该函数允许您将查询中的值动态转换为给定的数据类型。

SELECT * FROM table WHERE period_start_utc >= CAST('2023-01-01T00:00:00.000Z' AS TIMESTAMP)

FROM 是在每个Atlas SQL查询中评估的第一个子句。

FROM 可以从各种来源提取数据,包括集合(SELECT * FROM foo) 、数组(SELECT * FROM [{'a': 1}]) 、联接(SELECT * FROM a JOIN b) 、派生表(SELECT * FROM (SELECT a FROM foo) d)以及FLATTEN 和 UNWIND 。

WHERE子句是传入数据的筛选器。 其表达式必须静态具有BOOLNULL类型,并且计算结果可能为MISSING

GROUP BY 提供了一种对数据进行分组和聚合的方法。

如果对已使用FLATTEN 或 UNWIND 展平的字段使用GROUP BY ,则需要别名。

SELECT customerAge, COUNT(*) FROM Sales GROUP BY customer.age AS customerAge

Atlas SQL 支持以下聚合函数。

名称
说明
注意

ADD_TO_ARRAY

将该参数推入数组的末尾。此函数的总输出将是一个数组。

ADD_TO_ARRAY的参数可以是任何类型。

ADD_TO_SET

将该参数推入数组的末尾,并删除重复项。 此函数的总输出将是一个删除了所有重复项的数组。 重复项是使用=操作符确定的。

ADD_TO_SET的参数可以是任何类型。

AVG

返回所有参数的平均值。

参数必须静态类型化为数值类型。

COUNT

计算元素的数量。 COUNT(*)无条件地对所有值计数。 COUNT(<expression>)会计算表达式的结果不为NULLMISSING的所有值。

COUNT的参数可以是任何类型。

FIRST

返回组中的第一个元素。

仅当输入具有确定顺序时才具有确定性,否则为未定义。

LAST

返回组中的第一个元素。仅当输入具有确定顺序时才具有确定性,否则为未定义。

LAST的参数可以是任何类型。

MAX

返回按 Atlas SQL >操作符排序的最大元素。

参数必须是静态类型,以便通过>操作符进行比较。

MERGE_DOCUMENTS

返回通过连续合并文档形成的文档,前一个元素用作左侧。 如果有重复键,则保留新元素中键的值。 与FIRSTLAST一样,仅当输入具有确定性排序时,输出才是确定性的。

该参数的静态类型必须为DOCUMENT ,因此不支持MERGE_DOCUMENTS(DISTINCT x)

MIN

返回按 Atlas SQL <操作符排序的最小元素。

参数必须是静态类型,以便通过<操作符进行比较。

STDDEV_POP

返回整个群组总体中所有元素的标准偏差。

参数必须静态类型化为数值类型。 请参阅stdDevPop。

STDDEV_SAMP

返回组中所有元素的样本标准偏差。 请参阅stdDevPop。

参数必须静态类型化为数值类型。

SUM

返回所有参数的总和。

参数必须静态类型化为数值类型。

HAVING子句的作用与WHERE子句相同,但在GROUP BY子句之后。 与WHERE子句一样, HAVING子句采用的表达式必须静态具有类型BOOLNULL ,并且计算结果可能为MISSING 。 它可以引用GROUP BY中定义的别名,并且可以包含具有聚合函数的表达式。 只有在GROUP BY中定义的别名才可用于HAVING子句。

ORDER BY子句提供了一种通过一个或多个排序键对结果设立进行排序的方法。 每个排序键可以是列引用,也可以是根据SELECT表达式在选择表达式列表中的位置来引用该表达式的整数字面量。 作为列引用的排序键可以是复合标识符。 这些复合标识符可以用数据源名称来限定,或者指代文档子字段。

Atlas SQL 将MISSING排序在NULL之前,并将NULL排序在所有其他值之前。 ORDER BY子句要求排序键表达式中的所有可能值都可以通过> (大于)和< (小于)操作符以静态方式验证其可比性。

LIMITOFFSET子句允许用户仅检索查询返回的部分行。 如果提供了LIMIT数字,则返回的行数不会超过该数量。 如果提供了OFFSET数字,则在返回行之前跳过该数量的行。

LIMITOFFSET数字都必须是正整数。 使用LIMITOFFSET而不使用ORDER BY不能保证结果相同。

当同时设置了LIMITOFFSET时,将跳过OFFSET行,然后返回其余结果,其余结果应包含不超过LIMIT行数。

LIMIT i, jLIMIT i OFFSET j的缩写形式。

LIMITOFFSET可用于子查询。

UNION ALL设立操作符会为两个SELECT查询返回单个结果设立。 UNION ALL操作符不会删除结果设立的重复行。 UNION ALL操作符返回的结果设立没有定义的顺序。

Atlas SQL 不支持不同的UNIONINTERSECTEXCEPT集合操作。

Atlas SQL 中的标识符是指数据库、表和列。 Atlas SQL 标识符支持除空字符\x00之外的所有 UTF- 8字符。

在 Atlas SQL 中,一些标识符受到限制,以避免与具有其他语义含义的字符发生冲突;对于包含此类字符的标识符,必须对其进行分隔,即用双引号或反引号括起来。例如,如果标识符以数字开头或者与保留关键字冲突,则必须对其进行分隔(例如 "10cent")。无论是否分隔,标识符都区分大小写。

标识符用于 Atlas SQL 中的所有别名。 在大多数情况下,如果在同一子句中多次使用别名,Atlas SQL 会返回错误。 例外情况是别名可以在UNION ALL的两侧重复。 这也适用于自动生成的别名。

Atlas SQL 关键字(例如SELECTFROMJOIN等)不能用作未分隔的标识符。

Atlas SQL 支持布尔值、空值、数字和字符串的字面量。 字符串用单引号括起来。 要在string字面量中包含单引号字符,请将其加倍 ('o''clock')。

当字面整数在32位有符号整数范围时,其类型为INT ,否则为LONG 。 字面点或科学计数法数字的类型为DOUBLE

Atlas SQL 不支持每种类型的字面量。 例如, OBJECTIDBSON_DATEDECIMAL没有字面量语法。 对于此类类型,可以使用 CAST 操作符从这些类型的string或数字表示形式获取相应的类型,从而获得伪字面值。 某些类型还可能具有“构造器”函数,它们是相关CAST调用的别名。

带括号的表达式是用括号分组的表达式。 任何时候出现中缀运算符时,都可能需要使用括号(或类似的机制)来区分运算顺序。 Atlas SQL 有多个中缀运算符,例如+:: 。 例如, 1 + 2 * 3的值为7 ,而(1 + 2) * 3的值为9 。

Atlas SQL 支持以下基本操作符:

  • +

  • -

  • *

  • /

  • ||

  • <

  • <=

  • !=

  • ==

  • >

  • >=

  • BETWEEN

  • AND

  • OR

  • NOT

子查询是某个查询内的 SQL 查询。您可以在任何可以使用表达式的地方使用子查询。

Atlas SQL支持标量子查询和表子查询。标量子查询会返回包含零行或一行及一列的结果集。它可以用在大多数字面量或单列值有效的地方。表子查询会返回零行或多行及一列或多列。

文档可以使用类似于JSON对象的语法来表示。 键必须是字符串,值可以是任何受支持的类型。 为了访问权限文档字段, Atlas SQL支持两种选项:“点”表示法和“括号”表示法。

点符号类似于 MongoDB 聚合中的字段访问。 例如,如果文档doc包含字段f ,则表达式doc.f用于访问该字段的值。 方括号表示法是使用方括号( [] )将字段名括起来访问具有该名称的字段。 例如,对于前面描述的同一个文档: doc["f"]用于访问该字段的值。

BSON 会区分NULLMISSING 。 在NULL的情况下,存在一个字面值为NULL的字段,而在MISSING的情况下,该字段消失。

注释是查询中不影响查询执行的字符序列。Atlas SQL 支持标准 SQL 注释和 C 风格的块注释。

标准 SQL 注释以双破折号开头,以新行结尾:

\-- This is a standard SQL comment

块注释以\*开始,以匹配的*/结束。

\* This is a
multiline comment
*/

后退

Errors