Sintaxis cláusula Select
A continuación se muestra la sintaxis general de la cláusula SQL:.
SELECT [DISTINCT] expr_list [FROM [db.] table | (subquery) | table_function] [SAMPLE sample_coeff] [GLOBAL] [ANY|ALL] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER] JOIN (subquery)|table USING columns_list [PREWHERE expr] [WHERE expr] [GROUP BY expr_list] [WITH TOTALS] [HAVING expr] [ORDER BY expr_list] [LIMIT [n, ]m] [UNION ALL...] [LIMIT n BY columns] |
Cláusula FROM
La cláusula FROM especifica la tabla desde la cual se obtendrán los datos, una subquery o incluir una JOIN. Las subconsultas deben de ir entre paréntesis y a diferencia del SQL estándar, no es necesario especificar un sinónimo después de una subconsulta. Por compatibilidad, es posible escribir 'nombre AS' después de una subconsulta, pero el nombre especificado no se utilizará.
Cláusula SAMPLE
Permite el procesamiento de consultas por aproximación.
Cuando se utiliza la cláusula SAMPLE
, la consulta no se ejecuta teniendo en cuenta todos los datos, sino solo en una cierta fracción de ellos. Por ejemplo, si necesita calcular estadísticas de un determinado evento, es suficiente ejecutar la consulta en una fracción del 1/10 de todos los eventos y luego multiplicar el resultado por 10.
El procesamiento de consultas aproximado puede ser útil en los siguientes casos:
-
Cuando se quiere acelerar la obtención de resultados.
-
Cuando las datos sin procesar no reducen notablemente la calidad de los resultados.
Las características del muestreo de datos se enumeran a continuación:
-
El muestreo de datos es un mecanismo determinista. El resultado de la misma consulta es siempre el mismo.
-
El muestreo funciona consistentemente para diferentes tablas. Para tablas con una sola clave de muestreo, una muestra con el mismo coeficiente siempre selecciona el mismo subconjunto de datos posibles. Esto significa que puedes usar la muestra en subconsultas en la cláusula IN. Además, puedes unir muestras utilizando la cláusula JOIN.
-
El muestreo permite leer menos datos del disco. Ten en cuenta que debes especificar la clave de muestreo correctamente.
A continuación se indica la sintaxis admitida en la cláusula SAMPLE
.
Sintaxis | Descripción |
---|---|
SAMPLE k |
Número de 0 a 1. La consulta se ejecuta en una fracción |
SAMPLE n |
|
SAMPLE k OFFSET m |
|
Cláusula JOIN
Indica una operación de unión en álgebra relacional que combina columnas de una o más tablas creando un nuevo conjunto que puede almacenarse en una tabla o utilizarse tal cual. Es una forma de combinar columnas de una o más tablas usando valores comunes de cada una. Los tipos de JOINS soportados en Cytomic Orion son los siguientes:
-
INNER JOIN (o JOIN): compara cada una de las filas de A con las de B para encontrar todos los pares de filas que satisfacen el predicado de unión indicado en la cláusula
ON
. Cuando se satisface el predicado de unión haciendo coincidir valores no nulos, los valores de columna de cada par de filas coincidentes de A y B se combinan en una única fila de resultados. -
LEFT JOIN (o LEFT OUTER JOIN): el resultado siempre contiene todas las filas de la tabla “izquierda” (A), incluso si la condición de unión no encuentra ninguna fila coincidente en la tabla “derecha” (B). Esto significa que si la cláusula
ON
coincide con 0 (cero) filas en B (para una fila dada en A), la unión devolverá las filas de A pero conNULL
en cada columna de B. -
RIGHT JOIN (o RIGHT OUTER JOIN): el resultado siempre contiene todas las filas de la tabla “derecha” (B), incluso si la condición de unión no encuentra ninguna fila coincidente en la tabla “izquierda” (A). Esto significa que si la cláusula
ON
coincide con 0 (cero) filas en A (para una fila dada en B), la unión devolverá las filas de B pero conNULL
en cada columna de A. -
FULL JOIN (o FULL OUTER JOIN): combina el efecto de aplicar uniones
LEFT JOIN
yRIGHT JOIN
. Cuando las filas en las tablas no coincidan, el conjunto de resultados tendrá valoresNULL
para cada columna de la tabla que carece de una fila coincidente. Para aquellas filas que sí coinciden, se generará una sola fila en el conjunto de resultados (que contiene columnas con los datos de ambas tablas). -
CROSS JOIN (o , ): devuelve el producto cartesiano de las filas de las tablas, produciendo tantas filas como combinaciones resultantes de cada fila de la primera tabla con cada fila de la segunda tabla.
-
Modificador ANY o ALL: Si se especifica
ALL
y la tabla derecha tiene varias filas coincidentes, los datos se multiplicarán por el número de filas. Este es el comportamiento normal de una cláusulaJOIN
en SQL estándar. Si se especificaANY
y la tabla de la derecha tiene varias filas coincidentes, solo se unirá la primera que se encuentre. Si la tabla de la derecha tiene solo una fila coincidente, los resultados deANY
yALL
son los mismos.
Cláusula WHERE
Si se incluye una cláusula WHERE
, ésta debe contener una expresión que dé como resultado un dato de tipo UInt8, que suele ser una expresión de comparación mediante operadores lógicos. Esta expresión se utiliza para filtrar datos antes de todas las transformaciones incluidas en la sentencia.
Cláusula PREWHERE
Esta cláusula tiene el mismo significado que la cláusula WHERE
. La diferencia está en que cuando se utiliza PREWHERE
, primero se leen las columnas necesarias para ejecutarla y posteriormente se leen el resto de otras columnas necesarias para ejecutar la consulta, pero solo aquellos bloques donde la expresión PREWHERE
sea verdadera.
PREWHERE
filtra de forma efectiva los datos y reduce el volumen a leer del disco duro.
Cláusula GROUP BY
Agrupa el conjunto de resultados mediante una o más columnas. Para crear la agrupación Cytomic Orion interpreta los datos NULL
como un valor.
Si se especifica el modificador WITH TOTALS
, se calculará una fila adicional, que contendrá valores predeterminados (ceros o líneas vacías) y columnas de funciones agregadas con los valores calculados en todas las filas (valores "totales"). Esta fila adicional se genera en los formatos JSON, TabSeparated y Pretty. En formato JSON, esta fila se muestra como un campo de 'totales' separado. En formato TabSeparated, la fila aparecerá después del resultado principal, precedida por una fila vacía. En formato Pretty, la fila se muestra como una tabla separada después del resultado principal.
Puedes utilizar WITH TOTALS
en subconsultas, incluyéndolas en la cláusula JOIN (en este caso, se combinan los valores totales respectivos).
La cláusula GROUP BY
no admite argumentos por posición. Esto difiere de MySQL pero se ajusta a SQL estándar. Por ejemplo, GROUP BY 1, 2
se interpretará como agrupación por constantes (es decir, agregación de todas las filas en una).
Cláusula LIMIT N BY columnas
Selecciona las N
filas superiores para cada grupo de columnas. LIMIT N BY
no tiene relación con LIMIT
y ambas pueden ser utilizados en la misma consulta. LIMIT N BY
puede contener cualquier número de columnas o expresiones.
Cláusula HAVING
Permite filtrar el resultado recibido de GROUP BY
de forma similar a la como lo hace la cláusula WHERE
. WHERE
y HAVING
se diferencian en que WHERE
se ejecuta antes de la agregación (GROUP BY
), mientras que HAVING
después. Si no se realiza una agregación HAVING
no se puede utilizar.
La cláusula GROUP BY
no admite argumentos por posición. Esto difiere de MySQL pero se ajusta al lenguaje SQL estándar.
Cláusula ORDER BY
La cláusula ORDER BY
contiene una lista de expresiones a las que se les puede asignar una dirección de ordenación (DESC
- descendente o ASC
- ascendente, si no se especifica la dirección, se asume ASC
). La dirección de clasificación se aplica a una sola expresión, no a toda la lista.
Las filas que tienen valores idénticos para la lista de expresiones de clasificación se muestran en un orden arbitrario, que también puede ser no determinista (diferente cada vez). Si se omite la cláusula ORDER BY
, el orden de las filas tampoco está definido, y puede no ser determinista.
COLLATE
Al ordenar por valores de tipo cadena de caracteres (string) puedes añadir COLLATE
para especificar el alfabeto utilizado, por ejemplo ORDER BY SearchPhrase COLLATE 'tr'
, que ordena por palabra clave en orden ascendente, usando el alfabeto turco, sin distinción de mayúsculas y minúsculas y asumiendo que las cadenas están codificadas en UTF-8.
COLLATE
se puede especificar o no para cada expresión de forma independiente. Si se utiliza ASC
o DESC
, añade después COLLATE
. Cuando se usa COLLATE
, la clasificación siempre distingue entre mayúsculas y minúsculas.
Solo se recomienda usar COLLATE
para clasificar grupos de filas pequeños ya que es menos eficiente que la clasificación normal por bytes.
Orden de clasificación NaN y NULL:
-
Con el modificador NULLS FIRST: primero
NULL
, luegoNaN
, luego otros valores. -
Con el modificador NULLS LAST: primero los valores, luego
NaN
y luegoNULL
. -
Predeterminado: modificador
LAST NULLS
.
Cuando se ordenan los números en punto flotante, los resultados NaN
se separarán del resto de valores. Independientemente del orden de clasificación, los NaN
se situarán al final, es decir, para la clasificación ascendente se consideran como los números más grandes posibles, mientras que para la clasificación descendente se colocan como si fueran los más pequeños.
Cláusula SELECT
Las expresiones especificadas en la cláusula SELECT
se analizan una vez que se completan los cálculos para todas las cláusulas enumeradas anteriormente. Más específicamente, se analizan las expresiones que están por encima de las funciones agregadas, si existen. Las funciones agregadas y todo lo que está debajo de ellas se calcula durante la agregación (GROUP BY
). Estas expresiones funcionan como si se aplicaran a filas separadas en el resultado.
Cláusula DISTINC
Si se especifica DISTINCT
, solo se muestra una fila por cada conjunto de filas que coincidan completamente en el resultado. El resultado será el mismo que si se hubiera especificado GROUP BY
en todos los campos especificados en la cláusula SELECT
sin funciones agregadas, con las diferencias mostradas a continuación:
-
DISTINCT
se puede utilizar junto conGROUP BY
. -
Cuando se omite
ORDER BY
y se incluyeLIMIT
, la consulta deja de ejecutarse inmediatamente después de que se hayan leído el número requerido de filas diferentes. -
Los bloques de registros se muestran a medida que se procesan, sin esperar a que la consulta completa termine de ejecutarse.
DISTINCT
funciona con NULL
como si NULL
fuera un valor específico. En otras palabras, en los resultados DISTINCT
, las combinaciones diferentes con NULL
solo se producen una vez.
Cláusula LIMIT m
Selecciona las primeras m filas del resultado.
LÍMIT n, m
selecciona las primeras m
filas del resultado después de omitir las primeras n
filas. La sintaxis LIMIT m OFFSET n
también es compatible. n
y m
deben ser enteros no negativos.
Si no hay una cláusula ORDER BY
que ordene explícitamente los resultados, el resultado puede ser arbitrario y no determinista.
Cláusula UNION ALL
Combina cualquier número de consultas. Sólo se admite UNION ALL
, UNION (UNION DISTINCT)
no está soportado. Si necesitas UNION DISTINCT
puedes utilizar SELECT DISTINCT
desde una subconsulta que contenga UNION ALL
. Las consultas que forman parte de UNION ALL
se pueden ejecutar simultáneamente y sus resultados se pueden combinar.
La estructura de los resultados (el número y el tipo de columnas) debe coincidir para las consultas pero los nombres de las columnas pueden diferir. En este caso, los nombres de columna para el resultado final se tomarán de la primera consulta. Para uniones se realizan conversiones de tipos automáticas, por ejemplo, si dos consultas que se combinan tienen el mismo campo con tipos que no admiten Nullable y que aceptan Nullable, siendo tipos compatibles, la UNION ALL
resultante tendrá un campo de un tipo que admita Nullable.
Las consultas que forman parte de UNION ALL
no se pueden incluir entre paréntesis. ORDER BY
y LIMIT
se aplican a consultas separadas, no al resultado final. Si necesitas aplicar una conversión al resultado final, puede indicar todas las consultas con UNION ALL
en una subconsulta en la cláusula FROM
.
Operadores IN
Los operadores IN
, NOT
IN
, GLOBAL
IN
y GLOBAL NOT IN
se cubren por separado en este apartado, ya que su funcionalidad es bastante flexible.
El lado izquierdo de una expresión que utiliza IN
es una única columna o una tupla. Por ejemplo SELECT UserID IN (123, 456) FROM ..
.
Si el lado izquierdo es una columna que pertenece al índice y el lado derecho es un conjunto de constantes, el sistema utilizará el índice para procesar la consulta.
El lado derecho del operador puede ser un conjunto de expresiones constantes, un conjunto de tuplas, el nombre de una tabla de base de datos o una subconsulta SELECT
entre paréntesis. La subconsulta puede especificar más de una columna para filtrar las tuplas. Por ejemplo
SELECT (CounterID, UserID) IN (SELECT CounterID, UserID FROM ...) FROM ...
.
Las columnas a la izquierda y derecha del operador IN deben tener el mismo tipo.
El operador IN y la subconsulta pueden aparecer en cualquier parte de la consulta, incluidas las funciones agregadas y las funciones lambda.
Procesamiento de datos NULL
Durante el procesamiento de una solicitud, el operador IN
asume que el resultado de una operación con NULL
siempre es igual a 0, independientemente de si NULL
está en el lado derecho o izquierdo de la expresión. Los valores NULL
no se incluyen en ningún conjunto de datos, no se corresponden entre sí y no se pueden comparar.
Uso del asterisco (*)
Puedes incluir un asterisco en cualquier parte de una consulta en lugar de una expresión. Cuando se analiza la consulta, el asterisco se expande a una lista de todas las columnas de la tabla. El uso de un asterisco es raramente justificable:
-
Al crear un volcado de tabla.
-
Para tablas que contienen pocas columnas.
-
Para obtener información sobre qué columnas están en una tabla. En este caso, establece
LÍMIT 1
pero es mejor usarDESC TABLE
. -
Cuando haya muchas posibilidades de filtrar datos sobre un pequeño número de columnas utiliza
PREWHERE
. -
En subconsultas (ya que las columnas que no son necesarias para la consulta externa se excluyen de las subconsultas).
En todos los demás casos no se recomienda utilizar el asterisco por cuestiones de rendimiento.