Análisis sintáctico de consultas
- Un analizador SQL completo (un analizador descendente recursivo).
- Un analizador de formatos de datos (un analizador sintáctico rápido de flujo).
INSERT, que usa ambos analizadores.
Veamos la consulta siguiente:
INSERT utiliza ambos analizadores.
El fragmento INSERT INTO t VALUES se analiza con el analizador completo,
y los datos (1, 'Hello, world'), (2, 'abc'), (3, 'def') se analizan con el analizador de formato de datos, o analizador rápido de flujo.
Activar el analizador completo
Activar el analizador completo
También puede activar el analizador completo para los datos
mediante la configuración
input_format_values_interpret_expressions.Cuando la configuración mencionada anteriormente se establece en 1,
ClickHouse primero intenta analizar los valores con el analizador rápido de flujo.
Si falla, ClickHouse intenta usar el analizador completo para los datos, tratándolos como una expresión SQL.INSERT grandes, que es la forma recomendada de insertar datos en ClickHouse.
Al usar el formato Values en una consulta INSERT,
puede parecer que los datos se analizan igual que las expresiones de una consulta SELECT; sin embargo, no es así.
El formato Values es mucho más limitado.
El resto de esta sección trata sobre el analizador completo.
Para obtener más información sobre los analizadores de formatos, consulte la sección Formatos.
Espacios
- Puede haber cualquier cantidad de caracteres de espacio entre construcciones sintácticas (incluidos el principio y el final de una consulta).
- Los caracteres de espacio incluyen el espacio, la tabulación, el salto de línea, CR y el salto de página.
Comentarios
- Los comentarios de estilo SQL comienzan con
--,#!o#y continúan hasta el final de la línea. El espacio después de--y#!puede omitirse. - Comentarios de estilo C:
//(o más de 2 caracteres/) seguidos de texto hasta el final de la línea. No es necesario dejar espacios después de/.- Pueden abarcar desde
/*hasta*/para comentarios de varias líneas. Tampoco es necesario dejar espacios. - Los comentarios de estilo C pueden anidarse.
Palabras clave
- el estándar SQL. Por ejemplo,
SELECT,selectySeLeCtson válidos. - la implementación de algunos sistemas de gestión de bases de datos populares (MySQL o Postgres). Por ejemplo,
DateTimees lo mismo quedatetime.
Puede comprobar si un nombre de tipo de dato no es sensible a mayúsculas y minúsculas en la tabla system.data_type_families.
table_name tiene una columna con el nombre "FROM":
Identificadores
- Nombres de clúster, base de datos, tabla, partición y columna.
- Funciones.
- Tipos de datos.
- Alias de expresiones.
^[a-zA-Z_][0-9a-zA-Z_]*$ y no pueden ser iguales a las palabras clave.
Consulta la siguiente tabla para ver ejemplos de identificadores válidos e inválidos:
| Identificadores válidos | Identificadores inválidos |
|---|---|
xyz, _internal, Id_with_underscores_123_ | 1x, tom@gmail.com, äußerst_schön |
"id", `id`.
Las mismas reglas de escape que se aplican a los identificadores entre comillas también se aplican a los literales de cadena. Consulta String para obtener más detalles.
Literales
- String
- Numéricos
- Compuestos
NULL- Heredocs (literales de cadena personalizados)
String
- anteponiendo una comilla simple, donde el carácter de comilla simple
'(y solo este carácter) puede escaparse como'', o - anteponiendo una barra invertida con las siguientes secuencias de escape admitidas que se enumeran en la tabla de abajo.
La barra invertida pierde su significado especial; es decir, se interpreta literalmente si precede a caracteres distintos de los que se enumeran a continuación.
| Escape admitido | Descripción |
|---|---|
\xHH | Especificación de carácter de 8 bits seguida de cualquier número de dígitos hexadecimales (H). |
\N | reservado, no hace nada (p. ej., SELECT 'a\Nb' devuelve ab) |
\a | alerta |
\b | retroceso |
\e | carácter de escape |
\f | salto de página |
\n | salto de línea |
\r | retorno de carro |
\t | tabulación horizontal |
\v | tabulación vertical |
\0 | carácter nulo |
\\ | barra invertida |
\' (or '') | comilla simple |
\" | comilla doble |
` | acento grave |
\/ | barra |
\= | signo igual |
| ASCII control characters (c <= 31). |
En los literales de cadena, es necesario escapar al menos
' y \ usando los códigos de escape \' (o: '') y \\.Numéricos
- Si el literal lleva el prefijo del signo menos
-, se omite el token y el resultado cambia de signo después del análisis. - El literal numérico se analiza primero como un entero sin signo de 64 bits mediante la función strtoull.
- Si el valor lleva el prefijo
0bo0x/0X, el número se analiza como binario o hexadecimal, respectivamente. - Si el valor es negativo y su magnitud absoluta es mayor que 263, se devuelve un error.
- Si el valor lleva el prefijo
- Si esto falla, el valor se analiza a continuación como un número de punto flotante mediante la función strtod.
- En caso contrario, se devuelve un error.
1se analiza comoUInt8256se analiza comoUInt16.
ImportanteLos valores enteros de más de 64 bits (Esto omite el algoritmo anterior y analiza el entero con una rutina que admite precisión arbitraria.De lo contrario, el literal se analizará como un número de punto flotante y, por tanto, estará sujeto a pérdida de precisión debido al truncamiento.
UInt128, Int128, UInt256, Int256) deben convertirse a un tipo mayor para analizarse correctamente:_ dentro de los literales numéricos se ignoran y pueden usarse para mejorar la legibilidad.
Se admiten los siguientes literales numéricos:
| Literal numérico | Ejemplos |
|---|---|
| Enteros | 1, 10_000_000, 18446744073709551615, 01 |
| Decimales | 0.1 |
| Notación exponencial | 1e100, -1e-100 |
| Números de punto flotante | 123.456, inf, nan |
| Hexadecimal | 0xc0fe |
| Cadena hexadecimal compatible con el estándar SQL | x'c0fe' |
| Binario | 0b1101 |
| Cadena binaria compatible con el estándar SQL | b'1101' |
No se admiten literales octales para evitar errores accidentales de interpretación.
Compuestos
[]: [1, 2, 3]. Las tuplas se construyen con (): (1, 'Hello, world!', 2).
Técnicamente, estos no son literales, sino expresiones con el operador de creación de arrays y el operador de creación de tuplas, respectivamente.
Un array debe constar de al menos un elemento, y una tupla debe tener al menos dos elementos.
Hay un caso distinto en el que las tuplas aparecen en la cláusula
IN de una consulta SELECT.
Los resultados de la consulta pueden incluir tuplas, pero las tuplas no se pueden guardar en una base de datos (excepto en tablas que usan el motor Memory).NULL
NULL se utiliza para indicar que falta un valor.
Para almacenar NULL en un campo de una tabla, este debe ser del tipo Nullable.
Ten en cuenta lo siguiente sobre
NULL:- Según el formato de datos (de entrada o de salida),
NULLpuede tener una representación distinta. Para obtener más información, consulta formatos de datos. - El tratamiento de
NULLtiene ciertos matices. Por ejemplo, si al menos uno de los argumentos de una operación de comparación esNULL, el resultado de esa operación también esNULL. Lo mismo ocurre con la multiplicación, la suma y otras operaciones. Recomendamos leer la documentación de cada operación. - En las consultas, puedes comprobar
NULLmediante los operadoresIS NULLyIS NOT NULL, así como con las funciones relacionadasisNulleisNotNull.
Heredoc
$.
Por ejemplo:
- Un valor entre dos heredocs se procesa “tal cual”.
Definición y uso de parámetros de consulta
SET param_<name>=<value>— mediante un comandoSETen una consulta.--param_<name>='<value>'— como argumento declickhouse-clienten la línea de comandos.param_<name>=<value>— como parámetro de la cadena de consulta de la URL para la interfaz HTTP.
{<name>: <datatype>}, donde <name> es el nombre del parámetro de consulta y <datatype> es el tipo de dato al que se convierte.
Ejemplo con el comando SET
Ejemplo con el comando SET
Por ejemplo, el siguiente SQL define parámetros llamados
a, b, c y d, cada uno con un tipo de dato diferente:Ejemplo con clickhouse-client
Ejemplo con clickhouse-client
Si usa Si el parámetro de consulta representa el nombre de una base de datos, una tabla, una función u otro identificador, use
clickhouse-client, los parámetros se especifican como --param_name=value. Por ejemplo, el siguiente parámetro se llama message y se recupera como String:Identifier como tipo. Por ejemplo, la siguiente consulta devuelve filas de una tabla llamada uk_price_paid:Ejemplo con la interfaz HTTP
Ejemplo con la interfaz HTTP
Los parámetros de consulta pueden pasarse como parámetros en la cadena de consulta de la URL con el prefijo
param_. Por ejemplo:Ejemplo con la web UI
Ejemplo con la web UI
La web UI integrada (
play.html) detecta automáticamente los marcadores de parámetros {name:Type} en la consulta y muestra campos de entrada etiquetados para cada parámetro. Los valores de los parámetros se incluyen en la solicitud HTTP y también se conservan en la URL de la página para poder guardarla en marcadores y compartirla.Los parámetros de consulta no son sustituciones de texto generales que puedan usarse en lugares arbitrarios de consultas SQL arbitrarias.
Están diseñados principalmente para usarse en sentencias
SELECT en lugar de identificadores o literales.Funciones
().
A diferencia del SQL estándar, los paréntesis son obligatorios, incluso cuando la lista de argumentos está vacía.
Por ejemplo:
La sintaxis de las funciones de agregación sin parámetros es la misma que la de las funciones regulares.
Operadores
Tipos de datos y motores de tabla de la base de datos
CREATE se escriben de la misma forma que los identificadores o las funciones.
En otras palabras, pueden incluir o no una lista de argumentos entre paréntesis.
Para obtener más información, consulte las secciones:
Expresiones
- una función
- un identificador
- un literal
- la aplicación de un operador
- una expresión entre paréntesis
- una subconsulta
- un asterisco
Alias de expresiones
| Parte de la sintaxis | Descripción | Ejemplo | Notas |
|---|---|---|---|
AS | La palabra clave para definir alias. Puede definir el alias de un nombre de tabla o de una columna en una cláusula SELECT sin usar la palabra clave AS. | SELECT table_name_alias.column_name FROM table_name table_name_alias. | En la función CAST, la palabra clave AS tiene otro significado. Consulte la descripción de la función. |
expr | Cualquier expresión admitida por ClickHouse. | SELECT column_name * 2 AS double FROM some_table | |
alias | Nombre de expr. Los alias deben ajustarse a la sintaxis de los identificadores. | SELECT "table t".column_name FROM table_name AS "table t". |
Notas sobre el uso
- Los alias son globales dentro de una consulta o subconsulta, y puedes definir un alias en cualquier parte de una consulta para cualquier expresión. Por ejemplo:
- Los alias no son visibles dentro de las subconsultas ni entre distintas subconsultas. Por ejemplo, al ejecutar la siguiente consulta, ClickHouse genera la excepción
Unknown identifier: num:
- Si se define un alias para las columnas de resultado en la cláusula
SELECTde una subconsulta, estas columnas son visibles en la consulta externa. Por ejemplo:
- Tenga cuidado con los alias que coinciden con nombres de columnas o tablas. Consideremos el siguiente ejemplo:
t con la columna b.
Luego, al seleccionar datos, definimos el alias sum(b) AS b.
Como los alias son globales,
ClickHouse sustituyó el literal b de la expresión argMax(a, b) por la expresión sum(b).
Esta sustitución provocó la excepción.
Puede cambiar este comportamiento predeterminado estableciendo prefer_column_name_to_alias en
1.Asterisco
SELECT, un asterisco puede sustituir la expresión.
Para obtener más información, consulte la sección SELECT.