Todos los productos
Search
Centro de documentos

Hologres:SELECT

Última actualización: Sep 05, 2026

La instrucción SELECT consulta datos de cero o más tablas y es compatible con filtrado, agrupamiento, ordenamiento, uniones (joins) y operaciones de conjuntos.

Sintaxis

[ WITH with_query [, ...] ]
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
    * | expression [ [ AS ] output_name ] [, ...]
    [ FROM from_item [, ...] ]
    [ WHERE condition ]
    [ GROUP BY grouping_element [, ...] ]
    [ HAVING condition [, ...] ]
    [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
    [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start ]

Donde from_item es uno de los siguientes:

table_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
from_item [ NATURAL ] join_type from_item
          [ ON join_condition | USING ( join_column [, ...] ) ]

Donde grouping_element es una expresión: un nombre de columna, una constante, una función o cualquier combinación vinculada mediante operadores aritméticos o bit a bit.

Orden de procesamiento

La instrucción SELECT procesa las cláusulas en el siguiente orden lógico:

  1. FROM: Se evalúan todos los elementos de la lista FROM (tablas reales o virtuales). Si hay varios elementos, se genera un cross join de todas las tablas de origen.

  2. WHERE: Se eliminan las filas que no cumplen la condición.

  3. GROUP BY y agregaciones: Las filas se combinan en grupos según valores coincidentes. Las funciones de agregación calculan un resultado para cada grupo. Si existe una cláusula HAVING, se descartan los grupos que no cumplen la condición.

  4. SELECT: Las expresiones de salida generan las filas de resultado finales a partir de las filas o grupos seleccionados.

  5. DISTINCT: Se eliminan las filas duplicadas del conjunto de resultados.

  6. UNION / INTERSECT / EXCEPT: Los resultados de múltiples instrucciones SELECT se combinan mediante operadores de conjuntos. Los duplicados se eliminan a menos que se especifique ALL.

  7. ORDER BY: Las filas se ordenan según el criterio especificado. Sin una cláusula ORDER BY, las filas se devuelven en el orden que el sistema pueda generar más rápido.

  8. LIMIT (o FETCH FIRST) / OFFSET: Solo se devuelve un subconjunto de las filas del resultado.

Cláusulas

Cláusula WITH

La cláusula WITH define Common Table Expressions (CTE), que son subconsultas con nombre a las que se hace referencia en la consulta principal.

WITH query_name [ ( column_name [, ...] ) ] AS ( select )

Parámetro

Descripción

query_name

Nombre de la CTE. Se acepta cualquier identificador válido.

column_name

Nombres de columna correspondientes a los valores devueltos por la subconsulta, similares a la semántica de AS en una cláusula SELECT. La subconsulta puede ser cualquier consulta SELECT válida.

Separe varias CTE con comas. Una CTE posterior puede hacer referencia a una anterior. En consultas subsecuentes, utilice query_name directamente como si fuera una vista.

Si no se proporciona una lista de column_name, los nombres de columna toman como valor predeterminado aquellos devueltos por la subconsulta. Si se incluye una lista de column_name, la cantidad debe coincidir con las columnas que devuelve la instrucción SELECT.

Nota

Las CTE recursivas no son compatibles.

Lista SELECT

La lista SELECT (ubicada entre las palabras clave SELECT y FROM) especifica las expresiones que conforman las filas de salida.

Agregue AS output_name después de una expresión para asignar un nombre a la columna de salida. La palabra clave AS es opcional, salvo que el nombre entre en conflicto con una palabra clave de PostgreSQL; en ese caso, utilice AS o escriba el nombre entre comillas dobles. Si no se especifica un nombre explícito, PostgreSQL usa el nombre de la columna para referencias simples o genera un nombre como ?column? para expresiones complejas.

Haga referencia a una columna de salida por su nombre en las cláusulas ORDER BY y GROUP BY. En las cláusulas WHERE y HAVING, utilice la expresión completa en su lugar, ya que los nombres de columnas de salida no se reconocen en esos contextos.

Utilice un asterisco (*) como forma abreviada para seleccionar todas las columnas de las filas indicadas, o bien table_name.* para todas las columnas de una tabla específica. Al usar * o table_name.*, no es posible utilizar AS para cambiar el nombre de las columnas de salida.

Cláusula FROM

La cláusula FROM especifica una o más tablas de origen. Si hay varias tablas de origen, se genera un producto cartesiano (cross join) de todas las filas. Por lo general, una cláusula WHERE con condiciones de unión restringe el resultado a un subconjunto pequeño del producto cartesiano.

La cláusula FROM admite los siguientes elementos:

Elemento

Descripción

table_name

Nombre de una tabla o vista existente, calificado opcionalmente con el esquema.

alias

Nombre alternativo para un elemento de FROM. Los alias simplifican las consultas y resuelven ambigüedades en auto-uniones (self-joins). Cuando se proporciona un alias, el nombre real de la tabla o función queda oculto. Por ejemplo, dado FROM foo AS f, el resto de la consulta debe referirse al elemento como f, no como foo.

select

Una subconsulta SELECT dentro de la cláusula FROM actúa como una tabla temporal durante la ejecución de la consulta. Encierre la subconsulta entre paréntesis y proporcione un alias.

function_name

Una llamada a función en la cláusula FROM actúa como una tabla temporal. Esto resulta especialmente útil para funciones que devuelven conjuntos, aunque se permite cualquier función. Proporcione un alias igual que con una tabla y, de manera opcional, una lista de alias de columna para renombrar los atributos del tipo de retorno compuesto de la función, incluida cualquier columna agregada por ORDINALITY. Combine varias llamadas a función en un solo elemento FROM encerrándolas en ROWS FROM( ... ). La salida concatena la primera fila de cada función, luego la segunda, y así sucesivamente. Las funciones que producen menos filas rellenan las posiciones faltantes con valores NULL. El recuento total de filas equivale al máximo producido por cualquiera de las funciones individuales.

join_type

Se describe en Tipos de join.

join_condition

Expresión que se evalúa como un valor booleano (similar a una cláusula WHERE) y especifica qué filas coinciden en una unión.

USING (a, b, ...)

Forma abreviada de ON left_table.a = right_table.a AND left_table.b = right_table.b .... USING también garantiza que solo aparezca una copia de cada columna coincidente en la salida de la unión.

NATURAL

Forma abreviada de una cláusula USING que enumera todas las columnas con nombres idénticos en ambas tablas.

Tipos de join

Para los tipos de join INNER y OUTER, especifique exactamente una condición de unión: NATURAL, ON join_condition o USING (join_column [, ...]). CROSS JOIN no acepta condiciones de unión.

Sin paréntesis, los JOIN se anidan de izquierda a derecha. JOIN tiene mayor precedencia que las comas en la lista FROM. Utilice paréntesis para controlar el orden de anidamiento.

Tipo de join

Comportamiento

[INNER] JOIN

Devuelve todas las combinaciones de filas de ambas tablas que satisfacen la condición de unión.

LEFT [OUTER] JOIN

Devuelve todas las filas coincidentes, además de una copia de cada fila no coincidente de la tabla izquierda, extendida con valores NULL en las columnas del lado derecho. Solo la condición JOIN determina qué filas coinciden; las condiciones externas se aplican después.

RIGHT [OUTER] JOIN

Devuelve todas las filas coincidentes, además de cada fila no coincidente de la tabla derecha, extendida con valores NULL en el lado izquierdo. Equivale a un LEFT OUTER JOIN con las tablas intercambiadas.

FULL [OUTER] JOIN

Devuelve todas las filas coincidentes, además de cada fila no coincidente de la tabla izquierda (extendida con NULL a la derecha) y cada fila no coincidente de la tabla derecha (extendida con NULL a la izquierda).

CROSS JOIN

Produce un producto cartesiano simple, equivalente a INNER JOIN ON (TRUE). No se permite ninguna condición de unión.

Cláusula WHERE

La cláusula opcional WHERE filtra las filas del resultado.

WHERE condition

Parámetro

Descripción

condition

Cualquier expresión que se evalúe como un resultado booleano. Las filas que no cumplen esta condición se eliminan de la salida. Una fila satisface la condición cuando, al sustituir sus valores reales en las referencias de variables, el resultado es verdadero.

Cláusula GROUP BY

La cláusula opcional GROUP BY condensa las filas que comparten los mismos valores en las expresiones de agrupamiento en una sola fila de resumen.

GROUP BY grouping_element [, ...]

La expresión grouping_element puede ser el nombre de una columna de entrada, el nombre o número ordinal de una columna de salida de la lista SELECT, o una expresión formada por valores de columnas de entrada. Si un nombre es ambiguo, GROUP BY lo interpreta como un nombre de columna de entrada en lugar de un nombre de columna de salida.

Si un elemento de agrupamiento contiene GROUPING SETS, ROLLUP o CUBE, la cláusula GROUP BY define múltiples conjuntos de agrupamiento independientes. Esto equivale a un UNION ALL de subconsultas con cláusulas GROUP BY individuales para cada conjunto de agrupamiento.

Las funciones de agregación se calculan sobre todas las filas de cada grupo y producen un único valor por grupo. Si no hay una cláusula GROUP BY, la consulta trata todas las filas seleccionadas como un solo grupo.

Agregue una cláusula FILTER a una llamada de función de agregación para incluir solo las filas que cumplen la condición de filtro en la entrada de dicha agregación.

Cuando existe una cláusula GROUP BY o alguna función de agregación, las expresiones de la lista SELECT no pueden hacer referencia a columnas no agrupadas, excepto dentro de una función de agregación o cuando la columna no agrupada depende funcionalmente de las columnas agrupadas. Existe una dependencia funcional cuando las columnas agrupadas incluyen la clave primaria (o un subconjunto de ella) de la tabla que contiene la columna no agrupada.

Todas las funciones de agregación se calculan antes que cualquier expresión escalar en la cláusula HAVING o en la lista SELECT. Una expresión CASE no puede omitir el cálculo de una función de agregación.

Cláusula HAVING

La cláusula HAVING filtra los grupos generados por GROUP BY. Su sintaxis es igual a la de WHERE, pero HAVING opera sobre filas agrupadas en lugar de filas individuales.

HAVING condition [, ...]

Utilice HAVING para filtrar basándose en resultados de agregaciones. Por ejemplo, HAVING sum(length) < interval '5 hours' elimina los grupos donde la duración total es de 5 horas o más.

Nota

No se puede hacer referencia a nombres de columnas de salida en la cláusula HAVING. Utilice la expresión completa en su lugar.

CUBE, ROLLUP y GROUPING SETS

Estas subcláusulas extienden GROUP BY para definir múltiples conjuntos de agrupamiento en una sola consulta.

CUBE

CUBE genera subtotales para todas las combinaciones de las columnas de agrupamiento especificadas. Para n expresiones, CUBE produce 2^n grupos: todas las combinaciones de valores de columnas de dimensión junto con los valores agregados de las filas base coincidentes.

CUBE ( { expression | ( expression [, ...] ) } [, ...] )

Por ejemplo, CUBE (a, b, c) produce 2^3 = 8 grupos. Las filas agrupadas por las n expresiones son filas regulares; todas las demás son filas de superagregación.

ROLLUP

ROLLUP devuelve un subtotal para cada grupo y un total general para todos los grupos.

ROLLUP ( { expression | ( expression [, ...] ) } [, ...] )

GROUPING SETS

GROUPING SETS especifica exactamente qué conjuntos de agrupamiento se deben calcular. A diferencia de CUBE o ROLLUP, no genera todas las combinaciones posibles, lo que lo hace más eficiente cuando solo se necesitan grupos específicos.

GROUPING SETS ( grouping_element [, ...] )

Cláusula DISTINCT

SELECT DISTINCT elimina todas las filas duplicadas del conjunto de resultados y conserva solo una fila por cada grupo de duplicados.

Nota

SELECT DISTINCT en columnas del tipo de dato ARRAY no es compatible.

SELECT DISTINCT accountid FROM table;

COUNT DISTINCT

COUNT DISTINCT cuenta el número de valores distintos en una columna. Un valor que aparece varias veces se cuenta solo una vez. Los valores NULL se excluyen del recuento.

Recuento exacto:

SELECT c1, COUNT(DISTINCT c2) FROM table GROUP BY c1;

Recuento aproximado:

El uso de COUNT DISTINCT exacto puede consumir muchos recursos. Hologres ofrece approx_count_distinct como una alternativa aproximada que requiere menos recursos:

SELECT c1, approx_count_distinct(c2) FROM table GROUP BY c1;

Cláusula UNION

UNION calcula la unión de conjuntos de las filas devueltas por dos instrucciones SELECT.

select_statement UNION [ ALL | DISTINCT ] select_statement

Parámetro

Descripción

select_statement

Cualquier instrucción SELECT sin cláusulas ORDER BY, LIMIT, FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE ni FOR KEY SHARE. Si la subexpresión está encerrada entre paréntesis, se le pueden adjuntar ORDER BY y LIMIT. Sin paréntesis, estas cláusulas se aplican a todo el resultado de UNION.

UNION

Devuelve las filas que aparecen en uno o en ambos conjuntos de resultados. Ambas instrucciones SELECT deben producir el mismo número de columnas, y las columnas correspondientes deben tener tipos de datos compatibles. Las filas duplicadas se eliminan a menos que se especifique ALL. ALL evita la eliminación de duplicados, lo cual suele ser más rápido; utilice ALL siempre que sea posible. Especifique DISTINCT explícitamente para eliminar duplicados. Si hay varios operadores UNION en la misma consulta, se evalúan de izquierda a derecha, a menos que los paréntesis modifiquen el orden.

Cláusula INTERSECT

INTERSECT calcula la intersección de conjuntos de las filas devueltas por dos instrucciones SELECT.

select_statement INTERSECT [ ALL | DISTINCT ] select_statement

Parámetro

Descripción

select_statement

Cualquier instrucción SELECT sin cláusula ORDER BY ni LIMIT.

INTERSECT

Devuelve las filas que aparecen en ambos conjuntos de resultados. Los duplicados se eliminan a menos que se especifique ALL. Con ALL, una fila que aparece m veces en la tabla izquierda y n veces en la tabla derecha aparecerá min(m, n) veces en el resultado. Especifique DISTINCT explícitamente para eliminar duplicados. Los operadores INTERSECT múltiples se evalúan de izquierda a derecha, a menos que los paréntesis alteren el orden. INTERSECT tiene mayor precedencia que UNION. Por ejemplo, A UNION B INTERSECT C se evalúa como A UNION (B INTERSECT C).

Cláusula EXCEPT

EXCEPT calcula la diferencia de conjuntos: las filas presentes en el resultado del SELECT izquierdo que no están en el resultado del SELECT derecho.

select_statement EXCEPT [ ALL | DISTINCT ] select_statement

Parámetro

Descripción

select_statement

Cualquier instrucción SELECT sin cláusula ORDER BY ni LIMIT.

EXCEPT

Devuelve las filas del resultado izquierdo que no aparecen en el resultado derecho. Los duplicados se eliminan a menos que se especifique ALL. Con ALL, una fila que aparece m veces en la tabla izquierda y n veces en la tabla derecha aparecerá max(m - n, 0) veces en el resultado. Especifique DISTINCT explícitamente para eliminar duplicados. Los operadores EXCEPT múltiples se evalúan de izquierda a derecha, a menos que los paréntesis alteren el orden. EXCEPT tiene la misma precedencia que UNION.

Nota

FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE y FOR KEY SHARE no se pueden utilizar con resultados de EXCEPT ni con ninguna entrada de EXCEPT.

Cláusula ORDER BY

La cláusula opcional ORDER BY ordena las filas del resultado según una o más expresiones.

ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...]

Las filas se ordenan primero por la expresión más a la izquierda y luego por las expresiones subsecuentes para desempatar. Las filas iguales en todas las expresiones se devuelven en un orden que depende de la implementación.

Cada expresión puede ser:

  • El nombre o número ordinal de una columna de salida de la lista SELECT.

  • Una expresión arbitraria formada por valores de columnas de entrada.

El número ordinal hace referencia a la posición de la columna de salida (de izquierda a derecha), lo cual es útil para columnas sin nombres únicos. Generalmente, se prefiere asignar un nombre mediante AS.

Cuando una expresión de ORDER BY es un nombre simple que coincide tanto con un nombre de columna de salida como con uno de entrada, ORDER BY utiliza el nombre de la columna de salida. Esto difiere de GROUP BY, que en la misma situación utiliza el nombre de la columna de entrada. Esta inconsistencia existe para mantener la compatibilidad con el estándar SQL.

Dirección de ordenamiento:

  • Agregue ASC (ascendente, valor predeterminado) o DESC (descendente) después de cualquier expresión.

  • Alternativamente, utilice una cláusula USING con un operador de ordenamiento que sea miembro menor que o mayor que de una familia de operadores B-tree. ASC generalmente equivale a USING <, y DESC a USING >.

Orden de valores NULL:

  • NULLS LAST: Los valores NULL se ordenan después de todos los valores no NULL (predeterminado para ASC).

  • NULLS FIRST: Los valores NULL se ordenan antes de todos los valores no NULL (predeterminado para DESC).

  • De forma predeterminada, los valores NULL se tratan como mayores que los valores no NULL.

  • Con una cláusula USING, la posición predeterminada de NULL depende de si el operador es menor que o mayor que.

Las opciones de ordenamiento se aplican únicamente a la expresión que siguen. Por ejemplo, ORDER BY x, y DESC no es lo mismo que ORDER BY x DESC, y DESC.

Limitación: Cuando ORDER BY se aplica al resultado de UNION, INTERSECT o EXCEPT, solo se permiten nombres de columnas de salida o números ordinales; no se admiten expresiones.

Cláusula LIMIT

La cláusula LIMIT restringe el número de filas devueltas. FETCH FIRST es una sintaxis equivalente del estándar SQL.

LIMIT { count | ALL }
OFFSET start

Sintaxis alternativa del estándar SQL:

FETCH FIRST count ROWS ONLY

Parámetro

Descripción

count

Número máximo de filas a devolver. Un valor NULL se trata como LIMIT ALL (sin límite).

start

Número de filas que se deben omitir antes de comenzar a devolver filas. Un valor NULL se trata como OFFSET 0.

Cuando se especifican ambos, se omiten start filas antes de contar count filas para devolver.

Utilice una cláusula ORDER BY junto con LIMIT para obtener resultados predecibles. Sin ORDER BY, distintas ejecuciones pueden devolver diferentes subconjuntos; este es un comportamiento esperado, no un bug.

El planificador de consultas toma en cuenta LIMIT al generar el plan, por lo que diferentes valores de LIMIT y OFFSET pueden producir distintos órdenes de filas. Imponga un orden determinista con ORDER BY para lograr una paginación consistente.

Limitaciones

Hologres es compatible con PostgreSQL, pero no admite todas las funciones de SELECT de PostgreSQL. Se aplican las siguientes restricciones:

  • Las CTE recursivas no son compatibles.

  • SELECT DISTINCT en columnas del tipo de dato ARRAY no es compatible.

  • FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE y FOR KEY SHARE no se pueden utilizar con resultados de EXCEPT ni con entradas de EXCEPT.

Ejemplos

Consulta básica

Recuperar todas las columnas de una tabla:

SELECT * FROM distributors ORDER BY name;

Unir dos tablas

SELECT f.title, f.did, d.name, f.date_prod, f.kind
FROM distributors d, films f
WHERE f.did = d.did;

Cláusula WITH (CTE)

WITH distributor_name(name) AS (
    SELECT name FROM distributors
)
SELECT name FROM distributor_name ORDER BY name;

GROUP BY

SELECT kind, sum(length) AS total
FROM films
GROUP BY kind;

GROUP BY con HAVING

SELECT kind, sum(length) AS total
FROM films
GROUP BY kind
HAVING sum(length) < interval '5 hours';

GROUP BY CUBE

SELECT l_returnflag,
       l_shipmode,
       SUM(l_quantity)
FROM public.lineitem
GROUP BY CUBE ((l_returnflag), (l_shipmode))
ORDER BY l_returnflag, l_shipmode;

GROUP BY ROLLUP

SELECT l_returnflag,
       l_shipmode,
       SUM(l_quantity)
FROM public.lineitem
GROUP BY ROLLUP ((l_returnflag), (l_shipmode))
ORDER BY l_returnflag, l_shipmode;

GROUP BY GROUPING SETS

SELECT l_returnflag,
       l_shipmode,
       SUM(l_quantity)
FROM public.lineitem
GROUP BY GROUPING SETS ((l_returnflag, l_shipmode), ())
ORDER BY l_returnflag, l_shipmode;

DISTINCT

SELECT DISTINCT accountid FROM table;

COUNT DISTINCT (exacto y aproximado)

Exacto:

SELECT c1, COUNT(DISTINCT c2) FROM table GROUP BY c1;

Aproximado:

SELECT c1, approx_count_distinct(c2) FROM table GROUP BY c1;