Estrutura lexical do SQL padrão

No BigQuery, uma declaração é composta de vários tokens. Esses tokens incluem identificadores, identificadores entre aspas, literais, palavras-chave, operadores e caracteres especiais. Os tokens podem ser separados por espaços em branco (espaço, backspace, tabulação, nova linha) ou comentários.

Identificadores

São nomes associados a colunas, tabelas e outros objetos do banco de dados.

Os identificadores precisam começar com uma letra ou um caractere de sublinhado. Os caracteres seguintes podem ser letras, números ou caracteres de sublinhado. Identificadores entre aspas são os que ficam entre os caracteres de crase (`) e podem conter qualquer caractere, como espaços ou símbolos. Contudo, os identificadores entre aspas não podem ficar vazios. As palavras-chave reservadas só podem ser usadas como identificadores se estiverem entre crases.

Sintaxe (definida aqui como uma expressão regular):

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

Exemplos:

Customers5
_dataField1
ADGROUP

Exemplos inválidos:

5Customers
_dataField!
GROUP

O 5Customers começa com um número, não uma letra ou sublinhado. O _dataField! contém o caractere especial "!", que não é uma letra, número ou sublinhado. GROUP é uma palavra-chave reservada e, portanto, não pode ser usada como um identificador sem estar entre caracteres de acento grave.

Tanto os identificadores quanto os identificadores entre aspas não diferenciam maiúsculas de minúsculas, com pequenas diferenças. Consulte mais detalhes em Diferenciação entre maiúsculas e minúsculas.

Os identificadores entre aspas têm as mesmas sequências de escape que os literais de strings, definidos a seguir.

Literais

Um literal representa um valor constante de um tipo de dados integrado. Alguns tipos de dados podem ser expressos como literais, mas nem todos.

Literais de strings e bytes

Os literais de strings e de bytes precisam estar entre aspas, simples (') ou duplas ("), ou entre aspas triplas com grupos de três aspas simples (''') ou três aspas duplas (""").

Literais entre aspas:

Literal Exemplos Descrição
String entre aspas
  • "abc"
  • "it's"
  • 'it\'s'
  • 'Title: "Boy"'
Strings entre aspas simples (') podem conter aspas duplas sem escape ("), bem como o inverso.
Barras invertidas (\) iniciam sequências de escape. Veja a tabela Sequências de escape abaixo.
Strings entre aspas não podem conter novas linhas, mesmo se precedidas de barra invertida (\).
String entre três aspas
  • """abc"""
  • '''it's'''
  • '''Title:"Boy"'''
  • '''two
    lines'''
  • '''why\?'''
Novas linhas e aspas incorporadas são permitidas sem escapes, veja o quarto exemplo.
Barras invertidas (\) iniciam sequências de escape. Consulte a tabela Sequências de escape abaixo.
Não é permitida uma barra invertida (\) sem escape no final de uma linha.
Encerre a string com três aspas sem escape em uma linha que correspondam às aspas iniciais.
String bruta
  • R"abc+"
  • r'''abc+'''
  • R"""abc+"""
  • r'f\(abc,(.*),def\)'
Literais entre aspas ou entre três aspas que tenham o prefixo de literal de string bruta (r ou R) são interpretados como strings brutas/de expressões regulares.
Os caracteres de barra invertida (\) não atuam como caracteres de escape. Se houver uma barra invertida seguida de outro caractere no literal de string, os dois caracteres serão preservados.
Não é possível encerrar uma string bruta com um número ímpar de barras invertidas.
As strings brutas são úteis para a construção de expressões regulares.

Os caracteres de prefixo (r, R, b, B) são opcionais para strings entre aspas ou entre aspas triplas, e indicam que a string é do tipo bruta/expressão regular ou uma sequência de bytes, respectivamente. Por exemplo, b'abc' e b'''abc''' são interpretados como o tipo bytes. Não há diferenciação entre maiúsculas e minúsculas nos caracteres de prefixo.

Literais entre aspas com prefixos:

Literal Exemplo Descrição
Bytes
  • B"abc"
  • B'''abc'''
  • b"""abc"""
Literais entre aspas simples ou triplas que têm o prefixo de literal de bytes (b ou B) são interpretados como bytes.
Bytes brutos
  • br'abc+'
  • RB"abc+"
  • RB'''abc'''
Os prefixos r e b podem ser combinados em qualquer ordem. Por exemplo, rb'abc*' é equivalente a br'abc*'.

A tabela a seguir lista todas as sequências de escape válidas para representar caracteres não alfanuméricos em literais de strings e bytes. Qualquer sequência que não esteja nesta tabela resulta em erro.

Sequência de escape Descrição
\a Aviso sonoro
\b Backspace
\f Avanço de formulário
\n Nova linha
\r Retorno de carro
\t Tabulação
\v Tabulação vertical
\\ Barra invertida (\)
\? Ponto de interrogação (?)
\" Aspas duplas (")
\' Aspas simples (')
\` Crase (`)
\ooo Escape octal, com exatamente três dígitos (no intervalo de 0 a 7). É decodificado como um único caractere Unicode (em literais de strings) ou byte (em literais de bytes).
\xhh ou \Xhh Escape hexadecimal, com exatamente dois dígitos hexadecimais (0–9 ou A–F ou a–f). É decodificado como um único caractere Unicode (em literais de strings) ou byte (em literais de bytes). Exemplos:
  • '\x41' == 'A'
  • '\x41B' é 'AB'
  • '\x4' é um erro
\uhhhh Escape Unicode, com 'u' minúsculo e exatamente quatro dígitos hexadecimais. Válido somente em literais de strings ou identificadores.
Observe que o intervalo D800-DFFF não é permitido, já que são valores Unicode alternativos.
\Uhhhhhhhh Escape Unicode, com 'U' maiúsculo e exatamente oito dígitos hexadecimais. Válido somente em literais de strings ou identificadores.
O intervalo D800-DFFF não é permitido porque esses são valores Unicode alternativos. Além disso, valores maiores que 10FFFF não são permitidos.

Literais de inteiros

Literais de inteiros são uma sequência de dígitos decimais (0 a 9) ou um valor hexadecimal prefixado com "0x" ou "0X". Eles podem ser prefixados por "+" ou "-" para representar valores positivos e negativos, respectivamente. Por exemplo:

123
0xABC
-123

Um literal de inteiro é interpretado como INT64.

Literais NUMERIC

Você pode criar literais NUMERIC usando a palavra-chave NUMERIC seguida por um valor de ponto flutuante entre aspas.

Exemplos:

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

Literais de ponto flutuante

Opções de sintaxe:

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

DIGITS representa um ou mais números decimais (0 a 9) e e representa o marcador de expoente (e ou E).

Exemplos:

123.456e-67
.1E4
58.
4e2

Os literais numéricos que contêm um ponto decimal ou um marcador de expoente são presumidos como do tipo duplo.

A coerção implícita de literais de ponto flutuante para o tipo flutuante será possível se o valor estiver dentro do intervalo flutuante válido.

Não há representação literal de NaN ou infinitude, mas é possível fazer o cast para flutuante das strings que diferenciam entre maiúsculas e minúsculas a seguir:

  • "NaN"
  • "inf" ou "+inf"
  • "-inf"

Literais de matriz

Literais de matriz são listas separadas por vírgulas de elementos entre colchetes. A palavra-chave ARRAY é opcional, e um tipo de elemento T explícito também é opcional.

Exemplos:

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

Literais struct

Sintaxe:

(elem[, elem...])

em que elem é um elemento no struct. elem tem que ser um tipo de dados literal, não uma expressão ou nome de coluna.

A saída é um tipo de struct anônimo (structs são tipos não nomeados) com campos anônimos contendo tipos que correspondem aos existentes nas expressões de entrada.

Exemplo Tipo de saída
(1, 2, 3) STRUCT<int64,int64,int64>
(1, 'abc') STRUCT<int64,string>

Literais de data

Sintaxe:

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

Literais de data contêm a palavra-chave DATE seguida de um literal de string em conformidade com o formato de data canônico, e ficam entre aspas simples. Os literais de data aceitam um intervalo entre os anos 1 e 9999, inclusive. As datas fora desse intervalo são inválidas.

Por exemplo, o literal de data a seguir representa 27 de setembro de 2014:

DATE '2014-09-27'

Os literais de strings no formato de data canônico também forçam, implicitamente, o tipo DATE quando usados onde uma expressão do tipo DATE é esperada. Por exemplo, na consulta

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

o literal de string "2014-09-27" será forçado para um literal de data.

Literais de hora

Sintaxe:

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

Literais TIME contêm a palavra chave TIME e um literal de string em conformidade com o formato de hora canônico, e ficam entre aspas simples.

Por exemplo, a hora a seguir representa 12h30:

TIME '12:30:00.45'

Literais DATETIME

Sintaxe:

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

Os literais DATETIME contêm a palavra-chave DATETIME e um literal de string em conformidade com o formato DATETIME canônico, e ficam entre aspas simples.

Por exemplo, DATETIME a seguir representa 12h30 em 27 de setembro de 2014:

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

Os literais DATETIME aceitam um intervalo entre os anos 1 e 9999, inclusive. DATETIMEs fora desse intervalo são inválidos.

Os literais de strings no formato DATETIME canônico também forçam, implicitamente, o literal DATETIME quando usados onde uma expressão do tipo DATETIME é esperada.

Por exemplo:

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

Nesta consulta, o literal de string "2014-09-27 12:30:00.45" é forçado para um literal DATETIME.

Literais de timestamp

Sintaxe:

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

Os literais timestamp contêm a palavra-chave TIMESTAMP e um literal de string em conformidade com o formato timestamp canônico, e ficam entre aspas simples.

Os literais timestamp aceitam um intervalo entre os anos 1 e 9999, inclusive. Carimbos de data/hora fora desse intervalo são inválidos.

Um literal de carimbo de data/hora pode incluir um sufixo numérico para indicar o fuso horário:

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

Se esse sufixo estiver ausente, será usado o fuso horário padrão, UTC.

Por exemplo, o carimbo de data/hora a seguir representa 12h30 de 27 de setembro de 2014, usando o fuso horário UTC:

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

Para mais informações sobre fusos horários, consulte Fuso horário.

Literais de string com o formato de carimbo de data/hora canônico, incluindo aqueles com nomes de fusos horários, forçam implicitamente um literal de carimbo de data/hora quando usados onde uma expressão de carimbo de data/hora é esperada. Por exemplo, na consulta a seguir, o literal de string "2014-09-27 12:30:00.45 America/Los_Angeles" é forçado para um literal de timestamp.

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

Fuso horário

Devido à obrigatoriedade de mapear os literais de carimbo de data/hora para um ponto específico no tempo, um fuso horário é necessário para interpretar corretamente um literal. Se um fuso horário não for especificado como parte do próprio literal, o BigQuery usará o valor do fuso horário padrão, definido pela implementação do BigQuery.

O BigQuery representa os fusos horários usando strings no formato canônico a seguir, que representa o deslocamento do Tempo Universal Coordenado (UTC).

Formato:

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

Exemplos:

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

Também é possível expressar fusos horários com strings de nomes de fusos horários do banco de dados tz. Para uma referência menos explicativa, porém mais simples, consulte a Lista de fusos horários do banco de dados tz na Wikipédia. Os nomes de fusos horários canônicos têm o formato <continent/[region/]city>, como America/Los_Angeles.

Observação: nem todos os nomes de fusos horários são intercambiáveis, mesmo que eles relatem o mesmo horário durante uma determinada parte do ano. Por exemplo, America/Los_Angeles informa o mesmo horário que UTC-7:00 durante o horário de verão, mas informa o mesmo horário que UTC-8:00 fora do horário de verão.

Exemplo:

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

Diferenciação entre maiúsculas e minúsculas

As regras de diferenciação de maiúsculas e minúsculas aplicam-se ao BigQuery:

Categoria Diferenciação entre maiúsculas e minúsculas? Observações
Palavras-chave Não  
Nomes de funções Não  
Nomes de tabelas Sim  
Nomes de colunas Não  
Valores de strings Sim
Comparações de strings Sim  
Aliases dentro de uma consulta Não  
Correspondência com expressões regulares Consulte as observações A expressão regular correspondente diferencia entre maiúsculas e minúsculas por padrão, a menos que a própria expressão especifique que ela não deve fazer essa diferenciação.
Correspondência com LIKE Sim  

Palavras-chave reservadas

Palavras-chave são um grupo de tokens com significado especial na linguagem do BigQuery, e têm as seguintes características:

  • Não é possível usar palavras-chave como identificadores a menos que estejam entre caracteres de crase (`).
  • As palavras-chave não diferenciam maiúsculas de minúsculas.

O BigQuery tem as palavras-chave reservadas a seguir.

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

Ponto e vírgula de terminação

Opcionalmente, as declarações de string de consulta podem terminar com ponto e vírgula (;) quando enviadas por meio da Interface de Programação do Aplicativo (API).

Em uma solicitação com várias declarações, estas precisam ser separadas por ponto e vírgula, mas este é opcional após a declaração final. Em algumas ferramentas interativas, é necessário que as declarações terminem em ponto e vírgula.

Comentários

Comentários são sequências de caracteres ignoradas pelo analisador. O BigQuery é compatível com os tipos de comentários a seguir.

Comentários de linha única

Use um comentário de linha única se quiser que o comentário apareça em uma linha sozinho.

Exemplos

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

Comentários in-line

Use um comentário in-line se quiser que ele apareça na mesma linha que uma instrução. Um comentário precedido de # ou -- tem que aparecer à direita de uma instrução.

Exemplos

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

Comentários de várias linhas

Use um comentário de várias linhas se você precisar que o comentário abranja várias linhas. Comentários de várias linhas aninhados não são compatíveis.

Por exemplo

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";
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.