標準 SQL 詞法結構

BigQuery 陳述式包含一系列符記。符記包括「ID」、「加引號的 ID」、「文字」、「關鍵字」、「運算子」和「特殊字元」。您可以使用空白字元 (空格字元、退格字元、定位點字元、換行字元) 或註解分隔符記。

ID

ID 是與資料欄、資料表及其他資料庫物件相關聯的名稱。

ID 必須以字母或底線開頭。後續字元可以是字母、數字或底線。加引號的 ID 是以倒引號 (`) 字元括住的 ID,可包含任何字元,如空格或符號。但加引號的 ID 不能空白。保留的關鍵字只有在以倒引號括住時才能當成 ID 使用。

語法 (在此定義為規則運算式):

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

範例:

Customers5
_dataField1
ADGROUP

無效範例:

5Customers
_dataField!
GROUP

5Customers 是以數字起首,而不是以字母或底線起首。_dataField! 包含特殊字元「!」此字元並不是字母、數字或底線。 GROUP 是保留的關鍵字,因此,若未以倒引號字元括住,就不能當成 ID 使用。

一般 ID 和加引號的 ID 都不區分大小寫,但有一些細微差別。如需進一步詳細資訊,請參閱區分大小寫一文。

加引號的 ID 逸出序列與字串文字相同,定義如下。

文字

文字代表內建資料類型的一種常數值。有些但非全部資料類型可以使用文字表示。

字串與位元組文字

字串和位元組文字都必須「加引號」,可以使用單引號 (') 或雙引號 ("),或是以一組三個單引號 (''') 或三個雙引號 (""") 構成的「三引號」

加引號的文字:

文字 範例 說明
加引號的字串
  • "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 Bell
\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' 和 4 個十六進位數字。只適用於字串文字或 ID。
請注意,系統不允許使用 D800 到 DFFF 的範圍,因為這些是代理 unicode 值。
\Uhhhhhhhh Unicode 逸出,含大寫的 'U' 和 8 個十六進位數字。只適用於字串文字或 ID。
系統不允許使用 D800 到 DFFF 的範圍,因為這些值是代理 unicode 值。而且,系統也不允許大於 10FFFF 的值。

整數文字

整數文字是一連串十進位數字 (0 到 9) 或前置字串為「0x」或「0X」的十六進位值。整數的前置字元可以是「+」或「-」,分別代表正值和負值。範例:

123
0xABC
-123

系統會將整數文字解讀為 INT64

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'

在預期使用 DATE 類型運算式的陳述式中使用標準日期格式的字串文字時,該字串文字也可以隱含約制成 DATE 類型。例如,在下列查詢中

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 'YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD]]'

日期時間文字含有 DATETIME 關鍵字及字串文字,該字串文字符合標準日期時間格式並以單引號括住。

舉例來說,以下日期時間代表2014 年 9 月 27 日下午 12:30:

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

日期時間文字支援 1 到 9999 (含) 的年份範圍。超出此範圍的日期時間無效。

在預期使用 DATETIME 運算式的陳述式中使用標準日期時間格式的字串文字時,該字串文字可隱含約制成日期時間文字。

例如:

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

在此查詢中,字串文字 "2014-09-27 12:30:00.45" 會約制成日期時間文字。

時間戳記文字

語法:

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)。

舉例來說,下方的時間戳記代表 2014 年 9 月 27 日中午 12:30,時區為世界標準時間 (UTC):

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 資料庫中的字串時區名稱來表示時區。如需不用太詳盡的簡明參考資料,請參閱 Wikipedia 的 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 語言中有特殊意義的一組符記,具備下列性質:

  • 關鍵字只有在以倒引號 (`) 字元括住時才能當成 ID 使用。
  • 關鍵字不區分大小寫。

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 支援下列類型的註解。

單行註解

如果您希望註解以單獨一行顯示,請使用單行註解。

示例

# this is a single-line comment
SELECT book FROM library;
-- this is a single-line comment
SELECT book FROM library;
/* this is a single-line comment */
SELECT book FROM library;
SELECT book FROM library
/* this is a single-line comment */
WHERE book = "Ulysses";

內嵌註解

如果您希望註解以陳述式形式顯示在同一行,請使用內嵌註解。前面加上 #-- 的註解必須在陳述式的右側。

示例

SELECT book FROM library; # this is an inline comment
SELECT book FROM library; -- this is an inline comment
SELECT book FROM library; /* this is an inline comment */
SELECT book FROM library /* this is an inline comment */ WHERE book = "Ulysses";

多行註解

如果您需要加上橫跨多行的註解,請使用多行註解。系統不支援巢狀多行註解。

範例

SELECT book FROM library
/*
  This is a multiline comment
  on multiple lines
*/
WHERE book = "Ulysses";
SELECT book FROM library
/* this is a multiline comment
on two lines */
WHERE book = "Ulysses";
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁