標準 SQL 語彙の構造

BigQuery のステートメントは一連のトークンで構成されます。トークンには識別子、引用符付き識別子、リテラル、キーワード、演算子、特殊文字があります。トークンは空白(スペース、バックスペース、タブ、改行)またはコメントで区切ることができます。

識別子

識別子は、列、テーブルなどのデータベース オブジェクトに関連付けられる名前です。

  • 識別子は文字またはアンダースコア文字で始める必要があります。
  • 後続の文字には、文字、数字、アンダースコアを使用できます。
  • 識別子はバッククォート(`)文字で囲むことで、引用符付き識別子を作成できます。
    • 引用符付き識別子には、スペースや記号などあらゆる文字を含めることができます。
    • 引用符付き識別子は空にすることはできません。
    • 引用符付き識別子のエスケープ シーケンスは、文字列リテラルと同じです。
  • 識別子と引用符付き識別子では、どちらも大文字と小文字は区別されませんが、若干の意味的な違いがあります。詳細については、大文字と小文字の区別をご覧ください。
  • 予約済みキーワードは、引用符付き識別子としてのみ使用できます。
  • テーブル名識別子には、FROM 句と TABLE 句で参照するときにダッシュ(-)をサポートする追加の構文があります。

有効な識別子は次のとおりです。

Customers5
_dataField1
ADGROUP
`tableName~`

無効な識別子は次のとおりです。

5Customers
_dataField!
GROUP

5Customers が、文字やアンダースコアではなく、数字で始まっています。_dataField! には特殊文字「!」が含まれています。これは、文字、数字、アンダースコアのいずれでもありません。GROUP は予約済みキーワードであるため、バッククォート文字で囲まなければ識別子としては使用できません。

ダッシュを含むテーブル名をバッククォートで囲む必要はありません。次のものは同等です。

SELECT * FROM data-customers-287.mydatabase.mytable
SELECT * FROM `data-customers-287`.mydatabase.mytable

リテラル

リテラルは組み込みのデータ型の定数値を表します。一部のデータ型(すべてではありません)はリテラルとして表すことができます。

文字列リテラルとバイトリテラル

文字列リテラルとバイトリテラルはどちらも引用符で囲む必要があります。単一引用符(')または二重引用符(")を使用するか、3 つの単一引用符(''')または 3 つの二重引用符(""")で構成された三重引用符を使用します。

引用符付きリテラル:

リテラル 説明
引用符付き文字列
  • "abc"
  • "it's"
  • 'it\'s'
  • 'Title: "Boy"'
単一引用符(')で囲まれた引用符付き文字列には、エスケープされていない二重引用符(")を含めることができます。またその逆も可能です。
バックスラッシュ(\)によって、エスケープ シーケンスが導入されます。以下のエスケープ シーケンス表をご覧ください。
引用符付き文字列には改行を含めることはできず、文字列に先行してバックスラッシュ(\)を付けても機能しません。
三重引用符付き文字列
  • """abc"""
  • '''it's'''
  • '''Title:"Boy"'''
  • '''two
    lines'''
  • '''why\?'''
組み込みの改行と引用符は、エスケープを行わなくても使用できます。4 番目の例をご覧ください。
バックスラッシュ(\)によってエスケープ シーケンスが導入されます。以下のエスケープ シーケンス表をご覧ください。
エスケープしていないバックスラッシュ(\)を行の末尾に付けることはできません。
開始引用符と一致するようにエスケープしていない引用符を 3 つ連続で入力すると、文字列が終了します。
元の文字列
  • R"abc+"
  • r'''abc+'''
  • R"""abc+"""
  • r'f\(abc,(.*),def\)'
元の文字列のリテラル プレフィックス(rまたはR)を持つ、引用符または三重引用符付きのリテラルは、元 / 正規表現の文字列と解釈されます。
バックスラッシュ文字(\)はエスケープ文字として機能しません。文字列リテラルの内部にバックスラッシュとそれに続く別の文字がある場合は、両方の文字が保持されます。
元の文字列は、奇数のバックスラッシュで終えることはできません。
元の文字列は正規表現の作成に便利です。

プレフィックス文字(rRbB))は、引用符または三重引用符付きの文字列ではオプションであり、それぞれ文字列が元 / 正規表現の文字列であるか、またはバイト シーケンスであるかを示します。たとえば、b'abc'b'''abc''' は両方ともタイプバイトと解釈されます。プレフィックス文字では大文字と小文字が区別されません。

プレフィックスを含む引用符付きリテラル:

リテラル 説明
バイト
  • B"abc"
  • B'''abc'''
  • b"""abc"""
引用符または三重引用符付きのリテラルで、バイトリテラル プレフィックス(b または B)が存在するものはバイトとみなされます。
元のバイト
  • br'abc+'
  • RB"abc+"
  • RB'''abc'''
rb の接頭辞は、任意の順序で組み合わせることができます。たとえば、rb'abc*'br'abc*' と同じです。

次の表は、文字列リテラルとバイトリテラルで英数字以外の文字の表記に有効なすべてのエスケープ シーケンスの一覧です。この表に示されていないシーケンスはすべてエラーになります。

エスケープ シーケンス 説明
\a ベル
\b バックスペース
\f 改ページ
\n 改行
\r 復帰
\t タブ
\v 垂直タブ
\\ バックスラッシュ(\
\? 疑問符(?
\" 二重引用符("
\' 単一引用符('
\` バッククォート(`
\ooo 3 桁(範囲 0~7)で表現される 8 進エスケープ。単一の Unicode 文字(文字列リテラルの場合)またはバイト(バイトリテラルの場合)にデコードされます。
\xhh または \Xhh 2 桁の 16 進数(0~9 または A~F / a~f)による 16 進エスケープ。単一の Unicode 文字(文字列リテラルの場合)またはバイト(バイトリテラルの場合)にデコードされます。例:
  • '\x41' == 'A'
  • '\x41B''AB'
  • '\x4' はエラー
\uhhhh 小文字の「u」と 4 桁の 16 進数を含む Unicode エスケープ。文字列リテラルまたは識別子でのみ有効です。
サロゲート Unicode 値になるため、範囲 D800~DFFF の使用は許可されていません。
\Uhhhhhhhh 大文字の「U」と 8 桁の 16 進数を含む Unicode エスケープ。文字列リテラルまたは識別子でのみ有効です。
サロゲート Unicode 値になるため、範囲 D800~DFFF の使用は許可されていません。また、10FFFF を超える値も使用できません。

整数リテラル

整数リテラルは、10 進数(0~9)のシーケンスか、「0x」または「0X」のプレフィックスが付いた 16 進数値になります。整数値は先頭に「+」または「-」を付けることで、それぞれの正の値または負の値を示すことができます。例:

123
0xABC
-123

整数リテラルは INT64 として解釈されます。

数値リテラル

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 は 1 つ以上の 10 進数(0~9)を表し、e は指数マーカー(e または E)を表します。

例:

123.456e-67
.1E4
58.
4e2

小数点または指数マーカーを含む数値リテラルは、double 型であるものと推定されます。

浮動小数点リテラルを float 型に暗黙的に強制変換することは、値が有効な浮動小数点数の範囲内であれば可能です。

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 は式や列名ではなく、リテラルのデータ型でなければなりません。

出力データ型は匿名 struct 型になり(struct は名前付きの型ではありません)、入力式のデータ型と一致する型の匿名のフィールドが含まれます。

出力データ型
(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 リテラル

構文:

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 リテラルに強制変換されます。

DATETIME リテラルには、オプションの文字 Tt を含めることもできます。これは時刻のフラグで、日付と時刻の区切り文字として使用されます。この文字を使用する場合、前後にスペースを含めることはできません。以下は有効です。

DATETIME '2014-09-27T12:30:00.45'
DATETIME '2014-09-27t12: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 が使用されます。

たとえば、次のタイムスタンプは、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"

タイムスタンプ リテラルには、次のオプションの文字を含めることができます。

  • T または t: 時間のフラグ。日付と時刻の区切り文字として使用します。
  • Z または z: デフォルトのタイムゾーンのフラグ。これは [timezone] と一緒には使用できません。

これらの文字のいずれかを使用する場合、その前後にスペースを含めることはできません。以下は有効です。

TIMESTAMP '2017-01-18T12:34:56.123456Z'
TIMESTAMP '2017-01-18t12:34:56.123456'
TIMESTAMP '2017-01-18 12:34:56.123456z'
TIMESTAMP '2017-01-18 12:34:56.123456Z'

タイムゾーン

タイムスタンプ リテラルは特定の時点にマッピングされる必要があるため、リテラルを正しく解釈するためにはタイムゾーンが必要となります。タイムゾーンがリテラルの一部として指定されていない場合、BigQuery の実装によって設定されているデフォルトのタイムゾーンが使用されます。

BigQuery では、次に示す正規形式の文字列を使ってタイムゾーンが表されます。これは協定世界時(UTC)とのオフセットで示されます。

形式:

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

例:

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

タイムゾーンは tz database の文字列タイムゾーン名を使用して表すこともできます。あまり包括的ではありませんが簡潔な資料としては、Wikipedia の tz database のタイムゾーン一覧(英語)をご覧ください。正規のタイムゾーン名の形式は、<continent/[region/]city> となり、たとえば America/Los_Angeles などになります。

例:

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)を介してクエリ文字列ステートメントを送信する場合、終了セミコロン(;)をオプションとして使用できます。

複数のステートメントを含むリクエストでは、各ステートメントをセミコロンで区切る必要がありますが、最終ステートメントでのセミコロンはオプションになります。対話型ツールによっては、ステートメントに終了セミコロンを使用する必要があります。

末尾のカンマ

SELECT ステートメントのリストの末尾に、末尾のカンマ(,)をオプションとして使用できます。

SELECT name, release_date, FROM Books

コメント

コメントはパーサーによって無視される文字シーケンスです。BigQuery では次のタイプのコメントがサポートされています。

単一行コメント

1 行全体をコメントにするには、単一行コメントを使用します。

# 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";