# SELECT

Las consultas SELECT realizan la recuperación de datos. De forma predeterminada, los datos solicitados se devuelven al cliente, mientras que en conjunto con INSERT INTO se pueden enviar a una tabla diferente.

Sintaxis

SELECT [DISTINCT [ON (column1, column2, ...)]] expr_list
[FROM [db.]table | (subquery) | table_function] [FINAL]
[SAMPLE sample_coeff]
[ARRAY JOIN ...]
[GLOBAL] [ANY|ALL|ASOF] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI] JOIN (subquery)|table (ON <expr_list>)|(USING <column_list>)
[PREWHERE expr]
[WHERE expr]
[GROUP BY expr_list] [WITH ROLLUP|WITH CUBE] [WITH TOTALS]
[HAVING expr]
[ORDER BY expr_list] [WITH FILL] [FROM expr] [TO expr] [STEP expr] [INTERPOLATE [(expr_list)]]
[LIMIT [offset_value, ]n BY columns]
[LIMIT [n, ]m] [WITH TIES]
[SETTINGS ...]
[UNION  ...]
[INTO OUTFILE filename [COMPRESSION type [LEVEL level]] ]
[FORMAT format]

# Consultas SELECT

Las expresiones especificadas en la cláusula SELECT se calculan después de que se hayan completado todas las operaciones en las cláusulas descritas anteriormente. Estas expresiones funcionan como si se aplicaran a filas separadas en el resultado. Si las expresiones en la cláusula SELECT contienen funciones de agregación, entonces Myscal procesa las funciones de agregación y las expresiones utilizadas como argumentos durante la agregación GROUP BY.

Si desea incluir todas las columnas en el resultado, use el símbolo asterisco (*). Por ejemplo, SELECT * FROM ....

SELECT * FROM insert_table
SELECT *
FROM insert_table
Query id: 16064ddb-762f-4faf-9932-7f026ebbd6a6
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
│ 2 │ a │ 3 │
│ 3 │ b │ 1 │
└───┴───┴───┘
5 rows in set. Elapsed: 0.002 sec.

# Cláusula ORDER BY

Puede utilizar sinónimos (ALIAS AS) en cualquier parte de una consulta.

Las cláusulas GROUP BY, ORDER BY y LIMIT BY pueden admitir argumentos posicionales. Entonces, por ejemplo, ORDER BY 1,2 ordenará las filas en la tabla en la primera y luego en la segunda columna. Usando la tabla tabla_insercion como ejemplo anterior.

SELECT *
FROM insert_table
ORDER BY c ASC
Query id: 5976cd93-1714-466f-8acc-0a5b35efd22f
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 3 │ b │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
│ 2 │ a │ 3 │
└───┴───┴───┘
5 rows in set. Elapsed: 0.002 sec.

# Cláusula WHERE

Puede utilizar la cláusula WHERE para filtrar algunos valores, por ejemplo:

SELECT *
FROM insert_table
WHERE a = '1'
Query id: 273ac209-c4ca-4459-8314-3542913882ea
┌─a─┬─b─┬─c─┐
│ 1 │ a │ 1 │
│ 1 │ a │ 2 │
│ 1 │ a │ 3 │
└───┴───┴───┘
3 rows in set. Elapsed: 0.003 sec. 

# Cláusula PREWHERE

Prewhere es una optimización para aplicar el filtrado de manera más eficiente. Está habilitado de forma predeterminada incluso si la cláusula PREWHERE no se especifica explícitamente. Funciona moviendo automáticamente parte de la condición WHERE a la etapa de prewhere. El papel de la cláusula PREWHERE es solo controlar esta optimización si cree que sabe cómo hacerlo mejor que lo que sucede de forma predeterminada.

Con la optimización de prewhere, primero se leen solo las columnas necesarias para ejecutar la expresión de prewhere. Luego se leen las otras columnas que se necesitan para ejecutar el resto de la consulta, pero solo aquellos bloques donde la expresión de prewhere es verdadera al menos para algunas filas. Si hay muchos bloques donde la expresión de prewhere es falsa para todas las filas y prewhere necesita menos columnas que otras partes de la consulta, esto a menudo permite leer muchos menos datos del disco para la ejecución de la consulta.

# Controlar Prewhere Manualmente

La cláusula tiene el mismo significado que la cláusula WHERE. La diferencia está en qué datos se leen de la tabla. Al controlar manualmente PREWHERE para condiciones de filtrado que son utilizadas por una minoría de las columnas en la consulta, pero que proporcionan un fuerte filtrado de datos. Esto reduce el volumen de datos a leer.

Una consulta puede especificar simultáneamente PREWHERE y WHERE. En este caso, PREWHERE precede a WHERE.

Si la configuración optimize_move_to_prewhere se establece en 0, las heurísticas para mover automáticamente partes de expresiones de WHERE a PREWHERE están deshabilitadas.

Si la consulta tiene el modificador FINAL, la optimización PREWHERE no siempre es correcta. Se habilita solo si tanto la configuración optimize_move_to_prewhere como optimize_move_to_prewhere_if_final están activadas.

# Otros

Para declaraciones SELECT relacionadas con vectores, consulte: Búsqueda Básica de Vectores