标准 SQL 词法结构

BigQuery 语句由一系列标记组成。标记包括标识符、带引号标识符、字面量、关键字、运算符和特殊字符。您可以使用空格符(空格、退格、制表符、换行符)或注释来分隔标记。

标识符

标识符是指与列、表和其他数据库对象关联的名称。

标识符必须以字母或下划线开头。后续字符可以是字母、数字或下划线。带英文引号的标识符是由反引号 (`) 字符括起的标识符,可以包含任何字符(如空格或符号)。但是,带英文引号的标识符不能为空。预留关键字只有在用反引号括起时才能用作标识符。

语法(此处定义为正则表达式):

[A-Za-z_][A-Za-z_0-9]*

示例:

Customers5
_dataField1
ADGROUP

无效示例:

5Customers
_dataField!
GROUP

5Customers 以数字开头,而不是以字母或下划线开头。_dataField!包含特殊字符“!”,这个特殊字符不是字母、数字或下划线。 GROUP 是一个预留关键字,因此未用反引号括起时不能用作标识符。

标识符和带英文引号的标识符都不区分大小写,两者存在一些细微差别。如需了解详情,请参阅区分大小写

带英文引号的标识符与字符串字面量具有相同的转义序列,定义如下。

字面量

字面量代表内置数据类型的常量值。某些数据类型可以以字面量形式表示,但并非全部数据类型都能如此。

字符串和字节字面量

字符串和字节字面量都必须用英文单引号 (')、英文双引号 (") 或三引号(三个英文单引号构成的组 (''') 或三个英文双引号 (""") 构成的组)括起

带英文引号的字面量:

字面量 示例 说明
带英文引号的字符串
  • "abc"
  • "it's"
  • 'it\'s'
  • 'Title: "Boy"'
用英文单引号 (') 括起的字符串可以包含非转义英文双引号 ("),反之亦然。
反斜杠 (\) 可引入转义序列。请参阅下面的“转义序列”表。
带英文引号的字符串不能包含换行符,即使前面加了反斜杠 (\) 也不行。

三引号字符串
  • """abc"""
  • '''it's'''
  • '''Title:"Boy"'''
  • '''two
    lines'''
  • '''why\?'''
允许嵌入的换行符和引号,无需转义 - 请参见第四个示例。
反斜杠 (\) 可引入转义序列。请参阅下面的“转义序列”表。
不允许在行末尾处使用尾随未转义反斜杠 (\)。
使用与起始英文引号匹配的三个未转义英文引号结束字符串。


原始字符串
  • R"abc+"
  • r'''abc+'''
  • R"""abc+"""
  • r'f\(abc,(.*),def\)'
具有原始字符串字面量前缀(rR)的带英文引号或三引号的字面量会被解释为原始/正则表达式字符串。
反斜杠字符 (\) 不充当转义字符。如果字符串字面量内出现反斜杠后跟另一个字符,则这两个字符都将保留。
原始字符串不能以奇数个反斜杠结束。
原始字符串对于构造正则表达式很有用。


前缀字符(rRbB)对于带英文引号的字符串或三引号字符串是可选的,分别指示字符串是原始/正则表达式字符串或字节序列。例如,b'abc'b'''abc''' 都会被系统解释为字节类型。前缀字符不区分大小写。

带前缀且带英文引号的字面量:

字面量 示例 说明
字节
  • B"abc"
  • B'''abc'''
  • b"""abc"""
具有字节字面量前缀(bB)的带英文引号或三引号字面量会被解释为字节。
原始字节
  • br'abc+'
  • RB"abc+"
  • RB'''abc'''
rb 前缀可以按任意顺序进行组合。例如,rb'abc*' 等同于 br'abc*'

下表列出了在字符串和字节字面量中代表非字母数字字符的所有有效转义序列。此表未列出的任何序列都会引发错误。

转义序列 说明
\a 响铃
\b 退格符
\f 换页符
\n 换行符
\r 回车符
\t 制表符
\v 垂直制表符
\\ 反斜杠 (\)
\? 英文问号 (?)
\" 英文双引号 (")
\' 英文单引号 (')
\` 英文反引号 (`)
\ooo 八进制转义字符,仅包含 3 个数字(范围为 0-7)。解码为单个 Unicode 字符(字符串字面量形式)或字节(字节字面量形式)。
\xhh\Xhh 十六进制转义字符,仅包含 2 个十六进制数字(0-9 或 A-F 或 a-f)。解码为单个 Unicode 字符(字符串字面量形式)或字节(字节字面量形式)。示例:
  • '\x41' == 'A'
  • '\x41B''AB'
  • '\x4' 是一个错误
\uhhhh Unicode 转义字符,包含小写“u”和四个十六进制数字。仅在字符串字面量或标识符中有效。
请注意,不允许范围 D800-DFFF 内的值,因为这些是替代用 unicode 值。
\Uhhhhhhhh Unicode 转义字符,包含大写“U”和 8 个十六进制数字。仅在字符串字面量或标识符中有效。
不允许范围 D800-DFFF 内的值,因为这些是替代用 unicode 值。此外,不允许大于 10FFFF 的值。

整数字面量

整数字面量既可以是一系列十进制数字(0 到 9),也可以是一个前缀为“0x”的十六进制值。整数可以使用“+”或“-”作为前缀,分别表示正值和负值。

示例:

123
0xABC
-123

整数字面量会被解释为 INT64

NUMERIC 字面量

您可以使用 NUMERIC 关键字后接括在英文引号中的浮点值的形式,构造 NUMERIC 字面量。

示例:

SELECT NUMERIC '0';
SELECT NUMERIC '123456';
SELECT NUMERIC '-3.14';
SELECT NUMERIC '-0.54321';
SELECT NUMERIC '1.23456e05';
SELECT NUMERIC '-9.876e-3';

浮点数字面量

语法选项:

[+-]DIGITS.[DIGITS][e[+-]DIGITS]
[DIGITS].DIGITS[e[+-]DIGITS]
DIGITSe[+-]DIGITS

DIGITS 表示一个或多个十进制数字(0 到 9),e 表示指数标记(e 或 E)。

示例:

123.456e-67
.1E4
58.
4e2

系统会假定包含小数点或指数标记的数值字面量属于双精度类型。

如果值在有效的浮点数范围内,则可以将浮点数字面量的类型隐式强制转换为浮点数类型。

NaN 或无穷大没有字面量表示,但以下不区分大小写的字符串可显式强制转换为浮点数:

  • “NaN”
  • “inf”或“+inf”
  • “-inf”

数组字面量

数组字面量是用方括号括起来且以英文逗号分隔的元素列表。ARRAY 关键字是可选的,显式元素类型 T 也是可选的。

示例:

[1, 2, 3]
['x', 'y', 'xy']
ARRAY[1, 2, 3]
ARRAY<string>['x', 'y', 'xy']
ARRAY<int64>[]

结构体字面量

语法:

(elem[, elem...])

其中,elem 是结构体中的一个元素。elem 必须是字面量数据类型,而不是表达式或列名称。

输出类型是匿名结构体类型(结构体不是命名类型),其匿名字段的类型与输入表达式的类型匹配。

示例 输出类型
(1, 2, 3) STRUCT<int64,int64,int64>
(1, 'abc') STRUCT<int64,string>

日期字面量

语法:

DATE 'YYYY-M[M]-D[D]'

日期字面量包含 DATE 关键字,后跟遵循规范日期格式的字符串字面量(用英文单引号括起)。日期字面量支持 1 至 9999 年之间(含边界值)的范围。此范围之外的日期无效。

例如,以下日期字面量代表 2014 年 9 月 27 日:

DATE '2014-09-27'

在应使用“日期”类型表达式的情况下使用时,规范日期格式中的字符串字面量也会隐式强制转换为“日期”类型。例如,在以下查询中:

SELECT * FROM foo WHERE date_col = "2014-09-27"

字符串字面量“"2014-09-27"”将被强制转换为日期字面量。

时间字面量

语法:

TIME '[H]H:[M]M:[S]S[.DDDDDD]]'

时间字面量包含 TIME 关键字和一个遵循规范时间格式的字符串字面量(用英文单引号括起)。

例如,以下时间代表中午 12:30:

TIME '12:30:00.45'

DATETIME 字面量

语法:

DATETIME 'YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD]]'

DATETIME 字面量包含 DATETIME 关键字和一个遵循规范 DATETIME 格式的字符串字面量(用英文单引号括起)。

例如,以下 DATETIME 代表 2014 年 9 月 27 日中午 12:30:

DATETIME '2014-09-27 12:30:00.45'

DATETIME 字面量支持 1 至 9999 年之间(含边界值)的范围。此范围之外的 DATETIME 值无效。

在应使用 DATETIME 表达式的情况下使用时,规范 DATETIME 格式的字符串字面量会隐式强制转换为 DATETIME 字面量。

例如:

SELECT * FROM foo
WHERE datetime_col = "2014-09-27 12:30:00.45"

在此查询中,字符串字面量 "2014-09-27 12:30:00.45" 被强制转换为 DATETIME 字面量。

时间戳字面量

语法:

TIMESTAMP 'YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD]] [timezone]'

时间戳字面量包含 TIMESTAMP 关键字和一个遵循规范时间戳格式的字符串字面量(用英文单引号括起)。

时间戳字面量支持 1 至 9999 年之间(含边界值)的范围。此范围之外的时间戳是无效的。

时间戳字面量可以包含一个数字后缀来指示时区:

TIMESTAMP '2014-09-27 12:30:00.45-08'

如果此后缀不存在,则将使用默认时区世界协调时间 (UTC)。

例如,以下时间戳表示世界协调时间 (UTC) 时区 2014 年 9 月 27 日下午 12:30:

TIMESTAMP '2014-09-27 12:30:00.45'

如需详细了解时区,请参阅时区

在应使用时间戳表达式的情况下使用时,具有规范时间戳格式的字符串字面量(包括具有时区名称的那些字面量)会隐式强制转换为时间戳字面量。例如,在以下查询中,字符串字面量 "2014-09-27 12:30:00.45 America/Los_Angeles" 将被强制转换为时间戳字面量。

SELECT * FROM foo
WHERE timestamp_col = "2014-09-27 12:30:00.45 America/Los_Angeles"

时区

由于时间戳字面量必须映射到特定时间点,因此需要时区来正确解释字面量。如果未在字面量本身内指定时区,则 BigQuery 将使用 BigQuery 实现设置的默认时区值。

BigQuery 使用以下规范格式的字符串表示时区,该格式表示相对于协调世界时 (UTC) 的偏移量。

格式:

(+|-)H[H][:M[M]]

示例:

'-08:00'
'-8:15'
'+3:00'
'+07:30'
'-7'

也可以使用 tz 数据库中的字符串时区名称来表示时区。请参阅维基百科上的 tz 数据库时区列表,其中提供了虽不全面但较为简单的参考信息。规范时区名称的格式为 <continent/[region/]city>,例如 America/Los_Angeles

注意:并非所有时区名称都可以互换,即使在一年当中的某个给定部分,它们恰好报告了相同时间也是如此。例如,在实行夏令时期间,America/Los_Angeles 报告的同一时间以 UTC-7:00 为准;但在不实行夏令时期间,其报告的同一时间以 UTC-8:00 为准。

示例:

TIMESTAMP '2014-09-27 12:30:00 America/Los_Angeles'
TIMESTAMP '2014-09-27 12:30:00 America/Argentina/Buenos_Aires'

区分大小写

BigQuery 遵循以下区分大小写规则:

类别 是否区分大小写? 备注
关键字  
函数名称  
表名称  
列名称  
字符串值
字符串比较  
查询中的别名  
正则表达式匹配 请参见备注 默认情况下正则表达式匹配区分大小写,除非表达式本身指定不区分大小写。
LIKE 匹配  

预留关键字

关键字是 BigQuery 语言中具有特殊含义的一组标记,具有以下特征:

  • 只有在使用反引号 (`) 字符引导时,关键字才能用作标识符。
  • 关键字不区分大小写。

BigQuery 具有以下预留关键字。

ALL
AND
ANY
ARRAY
AS
ASC
ASSERT_ROWS_MODIFIED
AT
BETWEEN
BY
CASE
CAST
COLLATE
CONTAINS
CREATE
CROSS
CUBE
CURRENT
DEFAULT
DEFINE
DESC
DISTINCT
ELSE
END
ENUM
ESCAPE
EXCEPT
EXCLUDE
EXISTS
EXTRACT
FALSE
FETCH
FOLLOWING
FOR
FROM
FULL
GROUP
GROUPING
GROUPS
HASH
HAVING
IF
IGNORE
IN
INNER
INTERSECT
INTERVAL
INTO
IS
JOIN
LATERAL
LEFT
LIKE
LIMIT
LOOKUP
MERGE
NATURAL
NEW
NO
NOT
NULL
NULLS
OF
ON
OR
ORDER
OUTER
OVER
PARTITION
PRECEDING
PROTO
RANGE
RECURSIVE
RESPECT
RIGHT
ROLLUP
ROWS
SELECT
SET
SOME
STRUCT
TABLESAMPLE
THEN
TO
TREAT
TRUE
UNBOUNDED
UNION
UNNEST
USING
WHEN
WHERE
WINDOW
WITH
WITHIN

终止分号

在通过应用编程接口 (API) 提交查询字符串语句时,您可以选择使用终止分号 (;)。

在包含多个语句的请求中,您必须使用分号分隔各个语句,不过最后一个语句后的分号通常是可选的。一些交互式工具要求语句使用终止分号。

注释

注释是会被解析器所忽略的字符序列。BigQuery 支持以下类型的注释。

单行注释

可通过在注释前面加上 #-- 来支持单行注释。

示例

SELECT x FROM T; # x is a field and T is a table

注释包括从“#”字符开始到行尾的所有字符。

SELECT x FROM T; --x is a field and T is a table

注释包括从“--”序列开始到行尾的所有字符。您可以选择在“--”之后添加一个空格。

多行注释

可通过使用 /* <comment> */ 括起注释来支持多行注释。

示例:

SELECT x FROM T /* x is a field and T is a table */
WHERE x = 3;

无效示例:

SELECT x FROM T /* comment starts here
                /* comment ends on this line */
                this line is not considered a comment */
WHERE x = 3;

注释包括封闭在第一次出现的“/*”和随后第一次出现的“*/”内的所有字符(包括换行符)。系统不支持嵌套注释。第二个示例包含使查询无效的嵌套注释。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面