Sintaxis de la Cláusula Select
Aplica A: WatchGuard Advanced EPDR
Este tema describe la sintaxis general de una sentencia SQL SELECT.
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]
Puede utilizar estas cláusulas en una consulta SQL:
- Cláusula FROM
- Cláusula SAMPLE
- Cláusula JOIN
- Cláusula WHERE
- Cláusula PREWHERE
- Cláusula GROUP BY
- Cláusula LIMIT N BY Columns
- Cláusula HAVING
- Cláusula ORDER BY
- Cláusula SELECT
- Cláusula DISTINCT
- Cláusula LIMIT m
- Cláusula UNION ALL
- Operadores IN
- El Símbolo Asterisco (*)
Cláusula FROM
La cláusula FROM especifica el origen desde el que se leerán los datos (por ejemplo, una tabla, una subconsulta o una cláusula JOIN). Debe especificar las subconsultas entre paréntesis. A diferencia del SQL estándar, no es necesario especificar un sinónimo después de una subconsulta. Por motivos de compatibilidad, puede escribir ‘name AS’ después de una subconsulta, pero el nombre especificado no se utilizará.
Cláusula SAMPLE
La cláusula SAMPLE procesa las consultas para obtener datos aproximados.
Cuando se utiliza la cláusula SAMPLE, la consulta no se realiza en todos los datos, sino solo en un porcentaje de los mismos (muestra). Por ejemplo, si tiene que calcular estadísticas para varios eventos, basta con ejecutar la consulta en el 10 % de todos los eventos y luego multiplicar el resultado por 10.
El procesamiento aproximado de consultas puede ser útil en estos casos:
- Cuando desea acelerar la recopilación de resultados.
- Cuando los datos sin procesar no son precisos, por lo que la aproximación no degrada notablemente la calidad de los resultados.
Estas son las funciones del muestreo de datos:
- Es un mecanismo determinista. El resultado de la misma consulta es siempre el mismo.
- Funciona de forma coherente para diferentes tablas. En las tablas con una sola clave de muestreo, una muestra con el mismo coeficiente siempre selecciona el mismo subconjunto de datos posibles. Esto significa que puede utilizar la muestra en subconsultas en la cláusula IN. También puede utilizar la cláusula JOIN para unir muestras.
- Lee menos datos del disco. Debe especificar correctamente la clave de muestreo.
Sintaxis de la cláusula SAMPLE:
| Sintaxis | Descripción |
|---|---|
|
SAMPLE k |
Número del 0 al 1. La consulta se ejecuta en un porcentaje k de los datos. Por ejemplo, SAMPLE 0.1 ejecuta la consulta en el 10 % de los datos. |
|
SAMPLE n |
n es un número entero suficientemente grande. La consulta se ejecuta en una muestra de al menos n filas (pero no significativamente más que esto). Por ejemplo, SAMPLE 10000000 ejecuta la consulta en un mínimo de 10.000.000 filas. |
|
SAMPLE k OFFSET m |
k y m son números del 0 al 1. La consulta se ejecuta en una muestra del porcentaje k de los datos. Los datos utilizados para la muestra se desplazan en un porcentaje m. |
Cláusula JOIN
JOIN indica una operación de unión en álgebra relacional que combina columnas de una o más tablas y crea un nuevo grupo que se puede almacenar en una tabla o utilizar tal cual. Para crear una nueva tabla, JOIN utiliza los valores comunes en varias tablas y, a continuación, combina las columnas.
Estos son los tipos compatibles con la cláusula JOIN:
- INNER JOIN (o JOIN) — Compara cada fila de la tabla A con las filas de la tabla B para encontrar todos los pares de filas que satisfacen el predicado de unión especificado en la cláusula ON. Cuando el predicado de unión coincide con valores non-NULL, los valores de columna de cada par coincidente de filas de las tablas A y B se combinan en una fila de resultado.
- LEFT JOIN (o LEFT OUTER JOIN) — Siempre contiene todas las filas de la tabla "izquierda" (A), incluso si la condición de unión no coincide con las filas de la tabla "derecha" (tabla B). Esto significa que si la cláusula ON coincide con 0 (cero) filas de la tabla B (para una fila determinada de la tabla A), la unión seguirá devolviendo una fila en el resultado (para esa fila), pero con NULL en cada columna de la tabla B.
- RIGHT JOIN (o RIGHT OUTER JOIN) — Siempre contiene todas las filas de la tabla "derecha" (tabla B), incluso si la condición de unión no coincide con las filas de la tabla "izquierda" (tabla A). Esto significa que si la cláusula ON coincide con 0 (cero) filas de la tabla A (para una fila determinada de la tabla B), la unión seguirá devolviendo una fila en el resultado (para esa fila), pero con NULL en cada columna de la tabla A.
- FULL JOIN (o FULL OUTER JOIN) — Combina el efecto de LEFT JOIN y RIGHT JOIN. Cuando las filas de las tablas con unión externa completa no coinciden, el conjunto de resultados tendrá valores NULL para cada columna de la tabla que carezca de una fila coincidente. Para aquellas filas que sí coinciden, se produce una sola fila en el conjunto de resultados que contiene columnas rellenadas desde ambas tablas.
- CROSS JOIN (o , ) — Devuelve el producto Cartesiano de las filas de las tablas de la unión. Produce filas que combinan 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 multiplican 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 derecha tiene varias filas coincidentes, solo se une la primera que se encuentra. Si la tabla derecha solo tiene una fila coincidente, los resultados de ANY y ALL son iguales.
Cláusula WHERE
Si hay una cláusula WHERE, debe contener una expresión con el tipo UInt8. Normalmente se trata de una expresión con operadores de comparación y lógicos. Esta expresión se utiliza para filtrar los 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 radica en los datos que se leen de la tabla. Con PREWHERE, primero se leen las columnas necesarias para ejecutar la cláusula. A continuación, las columnas necesarias para ejecutar el resto de la consulta se leen cuando la expresión PREWHERE es verdadera.
PREWHERE filtra los datos de forma más eficiente y lee menos datos del disco para ejecutar la consulta.
Cláusula GROUP BY
Esta cláusula agrupa los resultados por una o varias columnas. Para la agrupación, Endpoint Security interpreta NULL como un valor.
Si se especifica el modificador WITH TOTALS, se calcula otra fila. Esta fila tiene columnas clave que contienen valores predeterminados (ceros o líneas vacías) y columnas de funciones agregadas con los valores calculados en todas las filas (los valores Totales). Esta fila adicional solo se produce en los formatos JSON, TabSeparated y Pretty. En los formatos JSON, esta fila se muestra como un campo Totales independiente. En los formatos TabSeparated, la fila aparece después del resultado principal, precedida por una fila vacía. En los formatos Pretty, la fila se muestra como una tabla independiente después del resultado principal.
Puede utilizar WITH TOTALS en subconsultas, lo que incluye subconsultas en la cláusula JOIN (en este caso, se combinan los valores totales respectivos).
Caution: A diferencia de MySQL (y SQL estándar), la sentencia GROUP BY no admite argumentos posicionales. Por ejemplo, GROUP BY 1, 2 se interpreta como agrupar por constante (es decir, todas las filas en una).
Cláusula LIMIT N BY Columns
Esta cláusula selecciona las primeras N filas de cada grupo de columnas. LIMIT N BY no está relacionado con LIMIT. Ambas se pueden utilizar en la misma consulta. LIMIT N BY puede contener cualquier número de columnas o expresiones.
Cláusula HAVING
Esta cláusula permite filtrar los resultados de la agregación producidos por GROUP BY. Es similar a la cláusula WHERE, pero la diferencia es que WHERE se ejecuta antes de la agregación (GROUP BY), mientras que HAVING se ejecuta después. No puede utilizar HAVING si no realiza la agregación.
Caution: A diferencia de MySQL (y de conformidad con el SQL estándar), la sentencia GROUP BY no admite argumentos posicionales.
Cláusula ORDER BY
La cláusula ORDER BY contiene una lista de expresiones, a cada una de las cuales se le puede atribuir un modificador DESC (descendente) o ASC (ascendente) para determinar la dirección de ordenamiento. Si no se especifica la dirección, se asume ASC. La dirección de ordenamiento 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 ordenamiento se muestran en un orden arbitrario, que también puede ser diferente cada vez. Si se omite la cláusula ORDER BY, el orden de las filas también es indefinido y puede ser diferente cada vez.
COLLATE
Cuando se ordena por valores de cadena, se puede utilizar COLLATE para especificar el alfabeto que se desea utilizar. Por ejemplo, utilice ORDER BY SearchPhrase COLLATE 'tr' para ordenar por palabra clave en orden ascendente, con el alfabeto turco y sin distinguir entre mayúsculas y minúsculas. Esto supone que las cadenas están codificadas en UTF-8.
Puede especificar COLLATE o no para cada expresión de forma independiente. Si especifica ASC o DESC, especifique COLLATE después. Cuando utiliza COLLATE, el ordenamiento siempre ignora las mayúsculas y minúsculas.
Recomendamos utilizar COLLATE solo para la clasificación final de un número reducido de filas, ya que la clasificación con COLLATE es menos eficiente que la clasificación normal por bytes.
Orden de Clasificación de NaN y NULL:
- Con el modificador NULLS FIRST — Primero NULL, luego NaN y, a continuación, los demás valores.
- Con el modificador NULLS LAST — Primero los valores, luego NaN y, a continuación, NULL.
- Predeterminado — Igual que con el modificador NULLS LAST.
Cuando se ordenan números de punto flotante, los NaN se separan del resto de valores. Independientemente del orden de clasificación, los NaN aparecen al final. Para la clasificación ascendente, se colocan como si fueran mayores que todos los demás números, mientras que para la clasificación descendente, se colocan como si fueran menores que los demás números.
Cláusula SELECT
Las expresiones especificadas en la cláusula SELECT se calculan después de que finalicen todas las operaciones de las cláusulas descritas anteriormente. Si las expresiones de la cláusula SELECT contienen funciones de agregación, la solución procesa las funciones de agregación y las expresiones utilizadas como argumentos durante la agregación GROUP BY. Estas expresiones funcionan como si se aplicaran a filas separadas en el resultado.
Cláusula DISTINCT
Si se especifica DISTINCT, solo queda una fila de todos los conjuntos de filas que coinciden completamente en el resultado. Es posible obtener el mismo resultado aplicando GROUP BY en el mismo conjunto de valores especificado como cláusula SELECT, sin utilizar ninguna función de agregación. La cláusula DISTINCT presenta las siguientes diferencias con respecto a la cláusula GROUP BY:
-
DISTINCT se puede aplicar junto con GROUP BY.
-
Cuando se omite ORDER BY y se define LIMIT, la consulta se detiene inmediatamente después de leer el número requerido de filas diferentes.
-
Los bloques de datos se envían a medida que se procesan, sin esperar a que finalice toda la consulta.
DISTINCT funciona con NULL como si NULL fuera un valor específico. En otras palabras, en los resultados de DISTINCT, las combinaciones diferentes con NULL solo aparecen una vez.
Cláusula LIMIT m
Esta cláusula 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 es equivalente. n y m deben ser números enteros no negativos.
Si no hay ninguna cláusula ORDER BY que ordene explícitamente los resultados, la elección de las filas para el resultado puede ser arbitraria y no determinista.
Cláusula UNION ALL
Puede utilizar esta cláusula para combinar cualquier número de consultas. Solo se admite UNION ALL. UNION (UNION DISTINCT) no es compatible. Si necesita UNION DISTINCT, puede escribir 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 mezclar.
La estructura de los resultados (el número y el tipo de columnas) debe coincidir en las consultas, pero los nombres de las columnas pueden ser diferentes. En este caso, los nombres de las columnas del resultado final se toman de la primera consulta. Se realiza una conversión de tipos para las uniones. Por ejemplo, si se combinan dos consultas con el mismo campo con tipos no Anulables y Anulables de un tipo compatible, el UNION ALL resultante tiene un campo de tipo Anulables.
No puede encerrar entre corchetes las consultas que forman parte de UNION ALL. ORDER BY y LIMIT se aplican a consultas separadas, no al resultado final. Si necesita aplicar una conversión al resultado final, puede colocar todas las consultas con UNION ALL en una subconsulta en la cláusula FROM.
Operadores IN
En esta sección se describen los operadores IN, NOT IN, GLOBAL IN y GLOBAL NOT IN.
El lado izquierdo del operador IN es una columna única o una tupla. Por ejemplo, SELECT UserID IN (123, 456) FROM ...
Si el lado izquierdo es una columna única que se encuentra en el índice y el lado derecho es un conjunto de constantes, el sistema utiliza 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 corchetes. La subconsulta puede especificar más de una columna para filtrar tuplas. Por ejemplo:
SELECT (CounterID, UserID) IN (SELECT CounterID, UserID FROM ...) FROM ....
Las columnas a la izquierda y a la 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 NULL
El operador IN asume que el resultado de una operación con NULL es siempre igual a 0, independientemente de si NULL se encuentra a la derecha o a la izquierda del operador. Los valores NULL no se incluyen en ningún conjunto de datos, no se corresponden entre sí y no se pueden comparar.
El Símbolo Asterisco (*)
Puede 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.
Puede utilizar un asterisco en estos casos:
- Para crear un volcado de tabla.
- Para tablas que contienen solo unas pocas columnas. Cuando hay un filtrado fuerte en un número reducido de columnas, utilice PREWHERE.
- Para obtener información sobre las columnas de una tabla. En este caso, establezca LIMIT 1. Le recomendamos que utilice la consulta DESC TABLE.
- 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, para evitar problemas de rendimiento, no le recomendamos que utilice el asterisco.