Estructura léxica y sintaxis

Las declaraciones SQL de Cloud Spanner se componen de una serie de tokens. Entre estos tokens se incluyen identificadores, identificadores entrecomillados, literales, palabras clave, operadores y caracteres especiales. Los tokens pueden estar separados por espacios en blanco (espacio, retroceso, tabulación o línea nueva) o comentarios.

Identificadores

Los identificadores son nombres que están asociados con columnas, tablas y otros objetos de una base de datos.

Los identificadores deben comenzar por una letra o un guion bajo. Los caracteres siguientes pueden ser letras, números o guiones bajos. Los identificadores entrecomillados son identificadores comprendidos entre acentos graves (`) que pueden contener cualquier carácter, como espacios o símbolos. Sin embargo, los identificadores entrecomillados no pueden estar vacíos. Las palabras clave reservadas solo se pueden usar como identificadores si están comprendidas entre acentos graves.

Sintaxis (definida aquí como una expresión regular):

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

Ejemplos:

Customers5
_dataField1
ADGROUP

Ejemplos no válidos:

5Customers
_dataField!
GROUP

5Customers comienza por un número, no por una letra o un guion bajo. _dataField! contiene el carácter especial "!", que no es una letra, ni un número, ni un guion bajo. GROUP es una palabra clave reservada y, por lo tanto, no se puede usar como un identificador sin estar comprendida entre caracteres de acentos graves.

Ni los identificadores, ni los identificadores entrecomillados distinguen entre mayúsculas y minúsculas, con algunos matices. Consulta el apartado sobre distinción entre mayúsculas y minúsculas para obtener más detalles.

Los identificadores entrecomillados cuentan con las mismas secuencias de escape que los literales de cadena, que se describen a continuación.

Literales

Un literal representa un valor constante de un tipo de datos integrado. No todos los tipos de datos se pueden expresar como literales.

Literales de cadena y bytes

Los literales, tanto de cadena como de bytes, deben estar entrecomillados, ya sea por comillas simples ('), dobles (") o por comillas triples en grupos de tres comillas simples (''') o tres comillas dobles (""").

Literales entrecomillados

Literal Ejemplos Descripción
Cadena entrecomillada
  • "abc"
  • "it's"
  • 'it\'s'
  • 'Title: "Boy"'
Las cadenas entrecomilladas por comillas simples (') pueden contener comillas dobles (") sin caracteres de escape y viceversa.
Las barras invertidas (\) introducen secuencias de escape. Consulta la tabla sobre secuencias de escape que se muestra a continuación.
Las cadenas entrecomilladas no pueden contener líneas nuevas, incluso cuando las precede una barra invertida (\).
Cadena entre comillas triples
  • """abc"""
  • '''it's'''
  • '''Title:"Boy"'''
  • '''two
    lines'''
  • '''why\?'''
Pueden contener líneas nuevas y comillas sin caracteres de escape (consulta el cuarto ejemplo).
Las barras invertidas (\) introducen secuencias de escape. Consulta la tabla sobre secuencias de escape que se muestra a continuación.
No se admiten las barras invertidas finales sin caracteres de escape (\) al final de una línea.
La presencia de tres comillas sin caracteres de escape que coincidan con las comillas de apertura marca el cierre de la cadena.
Cadena sin procesar
  • R"abc+"
  • r'''abc+'''
  • R"""abc+"""
  • r'f\(abc,(.*),def\)'
Los literales entrecomillados o con comillas triples que tienen el prefijo literal de cadena sin formato (r o R) se interpretan como cadenas sin o expresiones regulares.
Los caracteres de barra invertida (\) no actúan como caracteres de escape. Si se da el caso de que una barra invertida preceda a otro carácter dentro del literal de cadena, se conservan ambos caracteres.
Una cadena sin formato no puede terminar con un número impar de barras invertidas.
Las cadenas sin formato sirven para crear expresiones regulares.

El uso de caracteres de prefijo (r, R, b y B) no es obligatorio para las cadenas entrecomilladas o con comillas triples; estos indican que la cadena es una cadena sin formato o una expresión regular, o una secuencia de bytes, respectivamente. Por ejemplo, b'abc' y b'''abc''' se interpretan como tipos de bytes. Los caracteres de prefijo no distinguen entre mayúsculas y minúsculas.

Literales entrecomillados con prefijos:

Literal Ejemplo Descripción
Bytes
  • B"abc"
  • B'''abc'''
  • b"""abc"""
Los literales entrecomillados o con comillas triples que tienen un prefijo de literal de bytes (b o B) se interpretan como bytes.
Bytes sin procesar
  • br'abc+'
  • RB"abc+"
  • RB'''abc'''
Los prefijos r y b se pueden combinar en cualquier orden. Por ejemplo, rb'abc*' equivale a br'abc*'.

En la siguiente tabla se enumeran todas las secuencias de escape válidas para representar caracteres no alfanuméricos en literales de cadena y bytes. Cualquier secuencia que no se incluya en esta tabla provocará un error.

Secuencia de escape Descripción
\a Timbre
\b Retroceso
\f Avance de página
\n Línea nueva
\r Retorno de carro
\t Tabulador
\v Tabulador vertical
\\ Barra invertida (\)
\? Signo de interrogación (?)
\" Comillas dobles (")
\' Comilla simple (')
\` Acento grave (`)
\ooo Escape octal, con una cantidad exacta de tres dígitos (pertenecientes al intervalo 0-7). Sirve para decodificar un solo carácter Unicode (en literales de cadena) o byte (en literales de bytes).
\xhh o \Xhh Escape hexadecimal, con una cantidad exacta de dos dígitos hexadecimales (números entre 0 y 9, AF o af). Sirve para decodificar un solo carácter Unicode (en literales de cadena) o byte (en literales de bytes). Ejemplos:
  • '\x41' == 'A'
  • '\x41B' es 'AB'
  • '\x4' es un error
\uhhhh Escape Unicode, con la letra u minúscula y una cantidad exacta de cuatro dígitos hexadecimales. Solo es válido en literales de cadena o identificadores.
Ten en cuenta que el intervalo D800-DFFF no está permitido, ya que estos son valores sustitutivos de Unicode.
\Uhhhhhhhh Escape Unicode, con la letra U mayúscula y una cantidad exacta de ocho dígitos hexadecimales. Solo es válido en literales de cadena o identificadores.
Ten en cuenta que el intervalo D800-DFFF no está permitido, ya que estos son valores sustitutivos de Unicode. Además, no se admiten valores superiores a 10FFFF.

Literales de números enteros

Los literales de números enteros son una secuencia de dígitos decimales (0 a 9) o un valor hexadecimal con el prefijo "0x". Los números enteros pueden tener el prefijo "+" o "-" para representar los valores positivos y negativos, respectivamente.

Ejemplos:

123
0xABC
-123

Un literal entero se interpreta como un int64.

Literales de punto flotante

Opciones de sintaxis:

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

DIGITS representa uno o más números decimales (0 a 9) y e representa el marcador exponencial (e o E).

Ejemplos:

123.456e-67
.1E4
58.
4e2

Se asume que los literales numéricos que contienen un punto decimal o un marcador exponencial son de tipo doble.

La conversión implícita de literales de punto flotante a tipo flotante se puede realizar si el valor se encuentra en el intervalo de flotación válido.

No hay una representación literal de NaN o infinito, pero las siguientes cadenas que no distinguen entren mayúsculas y minúsculas se pueden convertir explícitamente al tipo flotante:

  • "NaN"
  • "inf" o "+inf"
  • "-inf"

Literales de matriz

Los literales de matriz son listas de elementos separados por comas comprendidos entre corchetes. La palabra clave ARRAY es opcional, así como los elementos explícitos tipo T.

Ejemplos:

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

Literales de estructura

Sintaxis:

(elem[, elem...])

Aquí, elem es un elemento de la estructura. elem debe ser un tipo de datos de literales, no una expresión ni un nombre de columna.

El tipo de salida es un tipo de estructura anónima (las estructuras no son tipos con nombre) con campos anónimos con tipos que coinciden con los tipos de las expresiones de entrada.

Ejemplo Tipo de salida
(1, 2, 3) STRUCT<int64,int64,int64>
(1, 'abc') STRUCT<int64,string>

Literales de fecha

Sintaxis:

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

Los literales de fecha contienen la palabra clave DATE seguida de un literal de cadena que se ajusta al formato de fecha canónica, comprendida entre comillas simples. Los literales de fecha admiten un intervalo del año 1 al 9999, ambos incluidos. Las fechas que no pertenezcan a este intervalo no son válidas.

Por ejemplo, este literal de fecha representa el 27 de septiembre de 2014:

DATE '2014-09-27'

Los literales de cadena en formato de fecha canónica también se convierten de forma implícita al tipo DATE al usarse cuando se espera una expresión de tipo DATE. Por ejemplo, en la consulta

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

el literal de cadena "2014-09-27" se convertirá en un literal de fecha.

Literales de marca de tiempo

Sintaxis:

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

Los literales de marca de tiempo contienen la palabra clave TIMESTAMP y un literal de cadena que se ajusta al formato canónico de marca de tiempo, comprendido entre comillas simples.

Los literales de marca de tiempo son compatibles con un intervalo comprendido entre los años 1 y 9999, ambos incluidos. Las marcas de tiempo que no pertenezcan a este intervalo no son válidas.

Un literal de marca de tiempo puede incluir un sufijo numérico para indicar la zona horaria:

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

Si este sufijo está ausente, se utiliza la zona horaria predeterminada, America/Los_Angeles.

Por ejemplo, la siguiente marca de tiempo representa las 12:30 del 27 de septiembre de 2014 de la zona horaria America/Los_Angeles:

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

Si quieres obtener más información sobre husos horarios, consulta el apartado sobre zona horaria.

Los literales de cadena con el formato canónico de marca de tiempo, entre ellos, los que tienen nombres de zona horaria, se convierten de forma implícita a un literal de marca de tiempo al usarse cuando se espera una expresión de marca de tiempo. Por ejemplo, en esta consulta, el literal de cadena "2014-09-27 12:30:00.45 America/Los_Angeles" se convierte a un literal de marca de tiempo.

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

Zona horaria

Dado que los literales de marca de tiempo deben asignarse a un punto específico del tiempo, se requiere una zona horaria para interpretar correctamente un literal. Si no se especifica una zona horaria como parte del literal en sí, se utilizará el valor predeterminado de la zona horaria, que se establece mediante el despliegue SQL de Cloud Spanner.

Las zonas horarias están representadas por cadenas en el siguiente formato canónico, que indica el desplazamiento de la hora universal coordinada (UTC).

Formato:

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

Ejemplos:

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

Las zonas horarias también se pueden expresar mediante nombres de husos horarios de TZ Database. Si quieres obtener una referencia menos completa, pero más simple, consulta la lista de zonas horarias de TZ Database en Wikipedia. Los nombres canónicos de la zona horaria tienen el formato <continent/[region/]city>, como America/Los_Angeles.

Ten en cuenta que no todos los nombres de zona horaria se pueden intercambiar, incluso si registra el mismo periodo durante una parte determinada del año. Por ejemplo, America/Los_Angeles registra el mismo periodo que UTC-7:00 durante el horario de verano, pero también registra el mismo tiempo que UTC-8:00 fuera del horario de verano.

Ejemplo:

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

Distinción entre mayúsculas y minúsculas

Cloud Spanner SQL sigue estas reglas para realizar la distinción entre mayúsculas y minúsculas:

Categoría Distinción entre mayúsculas y minúsculas Notas
Palabras clave No  
Nombres de funciones No  
Nombres de tabla Ver notas Los nombres de tabla no suelen distinguir entre mayúsculas y minúsculas, pero pueden hacerlo al consultar una base de datos con nombres de tablas que sí realicen la distinción.
Nombres de columna No  
Valores de cadena
Comparaciones de cadenas  
Alias de una consulta No  
Coincidencias de expresiones regular Ver notas La coincidencia de expresiones regulares distingue entre mayúsculas y minúsculas de forma predeterminada, a menos que la expresión en sí misma especifique que no debe hacerlo.
Coincidencia LIKE  

Palabras clave reservadas

Las palabras clave son un grupo de tokens que tienen un significado especial en el lenguaje SQL de Cloud Spanner y cuentan con las siguientes características:

  • Las palabras clave no se pueden usar como identificadores a menos que estén comprendidas entre caracteres de acento grave (`).
  • Las palabras clave no distinguen entre mayúsculas y minúsculas.

Cloud Spanner SQL cuenta con estas palabras clave reservadas.

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

Finalizar con un punto y coma

En las declaraciones, se puede usar de forma opcional un punto y coma de cierre (;) cuando se trata de una cadena de consulta enviada a través de una interfaz de programación de aplicaciones (API). Algunas herramientas interactivas requieren que las declaraciones tengan un punto y coma de cierre. En una petición que contiene varias instrucciones, las declaraciones deben estar separadas por punto y coma, pero este signo es opcional en la declaración final.

Parámetros de consulta

Sintaxis:

@param

Los parámetros de consulta se indican mediante identificadores precedidos por el carácter @. El usuario define el parámetro fuera de la declaración de consulta.

Los parámetros de consulta se pueden usar como sustitutos de las expresiones arbitrarias. Sin embargo, no se pueden usar para sustituir identificadores, nombres de columnas, nombres de tablas u otras partes de la consulta en sí.

Las API de cliente permiten vincular los nombres de los parámetros a valores; el parámetro se sustituirá por el valor resultante en el momento de la ejecución. Algunas API de cliente permiten realizar consultas con parámetros que no están vinculados a valores específicos, pero el tipo de parámetro debe definirse en el momento del análisis de la consulta.

Ejemplo:

SELECT * FROM Roster WHERE LastName = @myparam

Este ejemplo devuelve todas las filas en las que LastName es igual al valor del parámetro de consulta myparam.

Comentarios

Los comentarios son secuencias de caracteres que el analizador sintáctico ignora. Cloud Spanner SQL admite estos tipos de comentarios.

Comentarios de una línea

Los comentarios de una línea son compatibles cuando se anteponen # o -- a dicho comentario.

Ejemplos

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

El comentario incluye todos los caracteres desde "#" hasta el final de la línea.

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

El comentario incluye todos los caracteres de la secuencia "--" hasta el final de la línea. De forma opcional, puedes añadir un espacio después de "--".

Comentarios de varias líneas

Los comentarios de varias líneas son compatibles al expresar el comentario en este formato: /* <comment> */.

Ejemplo:

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

Ejemplo no válido:

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

En el comentario se incluyen todos los caracteres, entre ellos, las líneas nuevas, comprendidas entre la primera aparición de "/*" y la primera aparición siguiente de "*/". Los comentarios anidados no son compatibles. El segundo ejemplo contiene un comentario anidado, por lo que la consulta no es válida.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Cloud Spanner Documentation