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 k de muestra de datos. Por ejemplo, SAMPLE 0.1 ejecuta la consulta en el 10% de los datos.

SAMPLE n

n es un entero grande. La consulta se ejecuta en una muestra de al menos n filas (pero no significativamente más que el número indicado). Por ejemplo, SAMPLE 10000000 ejecuta la consulta en un mínimo de 10,000,000 de filas.

SAMPLE k OFFSET m

k y m son los números del 0 al 1. La consulta se ejecuta en una fracción k de muestra de los datos pero la consulta se aplica sobre la fracción desplazada indicada por m.

Parámetros admitidos por la cláusula SAMPLE

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 con NULL 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 con NULL en cada columna de A.

  • FULL JOIN (o FULL OUTER JOIN): combina el efecto de aplicar uniones LEFT JOIN y RIGHT JOIN. Cuando las filas en las tablas no coincidan, el conjunto de resultados tendrá valores NULL 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áusula JOIN en SQL estándar. Si se especifica ANY 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 de ANY y ALL 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, luego NaN, luego otros valores.

  • Con el modificador NULLS LAST: primero los valores, luego NaN y luego NULL.

  • 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 con GROUP BY.

  • Cuando se omite ORDER BY y se incluye LIMIT, 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 usar DESC 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.