Todos os produtos
Search
Central de documentação

Hologres:SELECT

Última atualização: Jun 28, 2026

O comando SELECT consulta dados de zero ou mais tabelas e oferece suporte a filtragem, agrupamento, ordenação, junções e operações de conjunto.

Sintaxe

[ 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 ]

Em que from_item é um dos seguintes:

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

Em que grouping_element é uma expressão: nome de coluna, constante, função ou qualquer combinação conectada por operadores aritméticos ou bit a bit.

Ordem de processamento

A instrução SELECT processa as cláusulas na seguinte ordem lógica:

  1. FROM: Avalia todos os itens da lista FROM (tabelas reais ou virtuais). Vários itens produzem uma junção cruzada de todas as tabelas de origem.

  2. WHERE: Remove as linhas que não satisfazem a condição.

  3. GROUP BY e agregações: Combina linhas em grupos com base em valores correspondentes. As funções de agregação calculam um resultado para cada grupo. Se houver uma cláusula HAVING, o sistema remove os grupos que não atendem à condição.

  4. SELECT: As expressões de saída calculam as linhas de resultado reais a partir das linhas ou grupos selecionados.

  5. DISTINCT: Elimina linhas duplicadas do conjunto de resultados.

  6. UNION / INTERSECT / EXCEPT: Combina múltiplos resultados de SELECT usando operadores de conjunto. O sistema remove duplicatas, a menos que ALL seja especificado.

  7. ORDER BY: Classifica as linhas na ordem especificada. Sem uma cláusula ORDER BY, as linhas retornam na ordem que o sistema conseguir produzir mais rapidamente.

  8. LIMIT (ou FETCH FIRST) / OFFSET: Retorna apenas um subconjunto das linhas de resultado.

Cláusulas

Cláusula WITH

A cláusula WITH define Expressões de Tabela Comuns (CTEs), que são subconsultas nomeadas referenciadas na consulta principal.

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

Parâmetro

Descrição

query_name

Nome da CTE. Aceita qualquer identificador válido.

column_name

Nomes das colunas correspondentes aos valores de retorno da subconsulta, semelhantes à semântica do AS em uma cláusula SELECT. A subconsulta pode ser qualquer consulta SELECT válida.

Separe múltiplas CTEs com vírgulas. Uma CTE posterior pode referenciar uma anterior. Nas consultas subsequentes, use query_name diretamente como uma visualização.

Sem uma lista de column_name, os nomes das colunas assumem como padrão aqueles retornados pela subconsulta. Com uma lista de column_name, a quantidade deve corresponder às colunas retornadas pela instrução SELECT.

Nota

Não há suporte para CTEs recursivas.

Lista SELECT

A lista SELECT (entre as palavras-chave SELECT e FROM) especifica as expressões que formam as linhas de saída.

Adicione AS output_name após uma expressão para nomear a coluna de saída. A palavra-chave AS é opcional, a menos que o nome entre em conflito com uma palavra-chave do PostgreSQL. Nesse caso, use AS ou coloque o nome entre aspas duplas. Sem um nome explícito, o PostgreSQL usa o nome da coluna para referências simples ou gera um nome como ?column? para expressões complexas.

Referencie uma coluna de saída pelo nome nas cláusulas ORDER BY e GROUP BY. Nas cláusulas WHERE e HAVING, use a expressão completa, pois esses contextos não reconhecem nomes de colunas de saída.

Use um asterisco (*) como abreviação para todas as colunas das linhas selecionadas, ou table_name.* para todas as colunas de uma tabela específica. Ao usar * ou table_name.*, o AS não pode renomear as colunas de saída.

Cláusula FROM

A cláusula FROM especifica uma ou mais tabelas de source. Múltiplas tabelas de source produzem um produto cartesiano (junção cruzada) de todas as linhas. Geralmente, uma cláusula WHERE com condições de junção restringe o resultado a um pequeno subconjunto do produto cartesiano.

A cláusula FROM oferece suporte aos seguintes elementos:

Elemento

Descrição

table_name

Nome de uma tabela ou visualização existente, opcionalmente qualificado com schema.

alias

Nome alternativo para um item do FROM. Aliases simplificam consultas e resolvem ambiguidades em autojunções. Quando um alias é fornecido, o nome real da tabela ou função fica oculto. Por exemplo, dado FROM foo AS f, o restante da consulta deve referir-se ao item como f, e não como foo.

select

Um sub-SELECT na cláusula FROM atua como uma tabela temporária durante a execução da consulta. Coloque o sub-SELECT entre parênteses e forneça um alias.

function_name

Uma chamada de função na cláusula FROM atua como uma tabela temporária. Isso é especialmente útil para funções que retornam conjuntos, embora qualquer função seja permitida. Forneça um alias como faria com uma tabela e, opcionalmente, uma lista de aliases de colunas para renomear atributos do tipo de retorno composto da função, incluindo qualquer coluna adicionada por ORDINALITY. Combine múltiplas chamadas de função em um único item FROM colocando-as em ROWS FROM( ... ). A saída concatena a primeira linha de cada função, depois a segunda linha, e assim por diante. Funções que produzem menos linhas preenchem as posições ausentes com NULLs. O total de linhas é igual ao máximo produzido por qualquer função individual.

join_type

Descrito em Tipos de junção.

join_condition

Expressão que avalia um valor booleano (semelhante a uma cláusula WHERE) e especifica quais linhas correspondem em uma junção.

USING (a, b, ...)

Abreviação para ON left_table.a = right_table.a AND left_table.b = right_table.b .... O USING também garante que apenas uma cópia de cada coluna correspondente apareça na saída da junção.

NATURAL

Abreviação para uma cláusula USING que lista todas as colunas com nomes idênticos em ambas as tabelas.

Tipos de junção

Para tipos de junção INNER e OUTER, especifique exatamente uma condição de junção: NATURAL, ON join_condition ou USING (join_column [, ...]). O CROSS JOIN não aceita condição de junção.

Sem parênteses, os JOINs se aninham da esquerda para a direita. O JOIN tem precedência maior que as vírgulas na lista FROM. Use parênteses para controlar a ordem de aninhamento.

Tipo de junção

Comportamento

[INNER] JOIN

Retorna todas as combinações de linhas de ambas as tabelas que satisfazem a condição de junção.

LEFT [OUTER] JOIN

Retorna todas as linhas correspondentes, mais uma cópia de cada linha não correspondente da tabela esquerda estendida com NULLs nas colunas do lado direito. Apenas a condição JOIN determina quais linhas correspondem; condições externas aplicam-se posteriormente.

RIGHT [OUTER] JOIN

Retorna todas as linhas correspondentes, mais cada linha não correspondente da tabela direita estendida com NULLs no lado esquerdo. Equivale a um LEFT OUTER JOIN com as tabelas trocadas.

FULL [OUTER] JOIN

Retorna todas as linhas correspondentes, mais cada linha não correspondente da tabela esquerda (estendida com NULLs à direita), além de cada linha não correspondente da tabela direita (estendida com NULLs à esquerda).

CROSS JOIN

Produz um produto cartesiano simples, equivalente a INNER JOIN ON (TRUE). Nenhuma condição de junção é permitida.

Cláusula WHERE

A cláusula opcional WHERE filtra linhas do resultado.

WHERE condition

Parâmetro

Descrição

condition

Qualquer expressão que avalie um resultado booleano. Linhas que não satisfazem essa condição são removidas da saída. Uma linha satisfaz a condição quando a substituição de suas referências variáveis pelos valores reais retorna verdadeiro.

Cláusula GROUP BY

A cláusula opcional GROUP BY condensa linhas que compartilham os mesmos valores de expressão de agrupamento em uma única linha de resumo.

GROUP BY grouping_element [, ...]

A expressão grouping_element pode ser o nome de uma coluna de entrada, o nome ou número ordinal de uma coluna de saída da lista SELECT, ou uma expressão formada por valores de colunas de entrada. Se um nome for ambíguo, o GROUP BY o interpreta como nome de coluna de entrada em vez de nome de coluna de saída.

Se um elemento de agrupamento contiver GROUPING SETS, ROLLUP ou CUBE, a cláusula GROUP BY define múltiplos conjuntos de agrupamento independentes. Isso equivale a um UNION ALL de subconsultas com cláusulas GROUP BY individuais para cada conjunto de agrupamento.

As funções de agregação calculam sobre todas as linhas em cada grupo, produzindo um único valor por grupo. Sem uma cláusula GROUP BY, a consulta trata todas as linhas selecionadas como um único grupo.

Anexe uma cláusula FILTER a uma chamada de função de agregação para incluir apenas as linhas que correspondem à condição de filtro na entrada dessa agregação.

Quando uma cláusula GROUP BY ou qualquer função de agregação estiver presente, as expressões da lista SELECT não podem referenciar colunas não agrupadas, exceto dentro de uma função de agregação ou quando a coluna não agrupada for funcionalmente dependente das colunas agrupadas. Existe uma dependência funcional quando as colunas agrupadas incluem a chave primária (ou um subconjunto dela) da tabela que contém a coluna não agrupada.

Todas as funções de agregação são calculadas antes de quaisquer expressões escalares na cláusula HAVING ou na lista SELECT. Uma expressão CASE não pode pular o cálculo de uma função de agregação.

Cláusula HAVING

A cláusula HAVING filtra grupos produzidos pelo GROUP BY. A sintaxe é igual à do WHERE, mas o HAVING opera em linhas agrupadas em vez de linhas individuais.

HAVING condition [, ...]

Use o HAVING para filtrar resultados de agregação. Por exemplo, HAVING sum(length) < interval '5 hours' remove grupos onde o comprimento total é de 5 horas ou mais.

Nota

Não é possível referenciar nomes de colunas de saída na cláusula HAVING. Use a expressão completa.

CUBE, ROLLUP e GROUPING SETS

Essas subcláusulas estendem o GROUP BY para definir múltiplos conjuntos de agrupamento em uma única consulta.

CUBE

O CUBE gera subtotais para todas as combinações das colunas de agrupamento especificadas. Para n expressões, o CUBE produz 2^n grupos: todas as combinações de valores de colunas de dimensão juntamente com valores agregados das linhas base correspondentes.

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

Por exemplo, CUBE (a, b, c) produz 2^3 = 8 grupos. Linhas agrupadas por todas as n expressões são linhas regulares; todas as outras são linhas de superagregação.

ROLLUP

O ROLLUP retorna um subtotal para cada grupo e um total geral para todos os grupos.

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

GROUPING SETS

O GROUPING SETS especifica exatamente quais conjuntos de agrupamento devem ser calculados. Ao contrário do CUBE ou ROLLUP, ele não gera todas as combinações possíveis, tornando-o mais eficiente quando apenas grupos específicos são necessários.

GROUPING SETS ( grouping_element [, ...] )

Cláusula DISTINCT

O SELECT DISTINCT remove todas as linhas duplicadas do conjunto de resultados, mantendo uma linha por grupo de duplicatas.

Nota

Não há suporte para SELECT DISTINCT em colunas do tipo de dados ARRAY.

SELECT DISTINCT accountid FROM table;

COUNT DISTINCT

O COUNT DISTINCT conta o número de valores distintos em uma coluna. Um valor que aparece várias vezes é contado apenas uma vez. Valores NULL são excluídos da contagem.

Contagem exata:

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

Contagem aproximada:

O COUNT DISTINCT exato pode consumir muitos recursos. O Hologres oferece approx_count_distinct como uma alternativa aproximada que consome menos recursos:

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

Cláusula UNION

O UNION calcula a união de conjuntos das linhas retornadas por duas instruções SELECT.

select_statement UNION [ ALL | DISTINCT ] select_statement

Parâmetro

Descrição

select_statement

Qualquer instrução SELECT sem cláusulas ORDER BY, LIMIT, FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE ou FOR KEY SHARE. Se a subexpressão estiver entre parênteses, ORDER BY e LIMIT podem ser anexados a ela. Sem parênteses, essas cláusulas aplicam-se a todo o resultado do UNION.

UNION

Retorna linhas que aparecem em um ou em ambos os conjuntos de resultados. Ambas as instruções SELECT devem produzir o mesmo número de colunas, e as colunas correspondentes devem ter tipos de dados compatíveis. Linhas duplicadas são removidas, a menos que ALL seja especificado. O ALL impede a remoção de duplicatas, o que geralmente é mais rápido — use ALL sempre que possível. Especifique DISTINCT explicitamente para remover duplicatas. Múltiplos operadores UNION na mesma consulta são avaliados da esquerda para a direita, a menos que parênteses alterem a ordem.

Cláusula INTERSECT

O INTERSECT calcula a interseção de conjuntos das linhas retornadas por duas instruções SELECT.

select_statement INTERSECT [ ALL | DISTINCT ] select_statement

Parâmetro

Descrição

select_statement

Qualquer instrução SELECT sem cláusula ORDER BY ou LIMIT.

INTERSECT

Retorna linhas que aparecem em ambos os conjuntos de resultados. Duplicatas são removidas, a menos que ALL seja especificado. Com ALL, uma linha que aparece m vezes na tabela esquerda e n vezes na tabela direita aparece min(m, n) vezes no resultado. Especifique DISTINCT explicitamente para remover duplicatas. Múltiplos operadores INTERSECT são avaliados da esquerda para a direita, a menos que parênteses alterem a ordem. O INTERSECT tem precedência maior que o UNION. Por exemplo, A UNION B INTERSECT C é avaliado como A UNION (B INTERSECT C).

Cláusula EXCEPT

O EXCEPT calcula a diferença de conjuntos: linhas no resultado do SELECT esquerdo que não estão no resultado do SELECT direito.

select_statement EXCEPT [ ALL | DISTINCT ] select_statement

Parâmetro

Descrição

select_statement

Qualquer instrução SELECT sem cláusula ORDER BY ou LIMIT.

EXCEPT

Retorna linhas do resultado esquerdo que não aparecem no resultado direito. Duplicatas são removidas, a menos que ALL seja especificado. Com ALL, uma linha que aparece m vezes na tabela esquerda e n vezes na tabela direita aparece max(m - n, 0) vezes no resultado. Especifique DISTINCT explicitamente para remover duplicatas. Múltiplos operadores EXCEPT são avaliados da esquerda para a direita, a menos que parênteses alterem a ordem. O EXCEPT tem a mesma precedência que o UNION.

Nota

FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE e FOR KEY SHARE não podem ser usados com resultados EXCEPT ou qualquer entrada EXCEPT.

Cláusula ORDER BY

A cláusula opcional ORDER BY classifica as linhas de resultado por uma ou mais expressões.

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

As linhas são classificadas primeiro pela expressão mais à esquerda, depois pelas expressões subsequentes para desempate. Linhas iguais em todas as expressões retornam em uma ordem dependente da implementação.

Cada expressão pode ser:

  • Nome ou número ordinal de uma coluna de saída da lista SELECT.

  • Expressão arbitrária formada por valores de colunas de entrada.

O número ordinal refere-se à posição da coluna de saída (da esquerda para a direita), útil para colunas sem nomes exclusivos. Atribuir um nome com AS é geralmente preferível.

Quando uma expressão ORDER BY é um nome simples que corresponde tanto a um nome de coluna de saída quanto a um nome de coluna de entrada, o ORDER BY usa o nome da coluna de saída. Isso difere do GROUP BY, que usa o nome da coluna de entrada na mesma situação. A inconsistência existe para compatibilidade com o padrão SQL.

Direção da classificação:

  • Adicione ASC (ascendente, o padrão) ou DESC (descendente) após qualquer expressão.

  • Alternativamente, use uma cláusula USING com um operador de ordenação que seja membro menor que ou maior que de uma família de operadores B-tree. ASC é geralmente equivalente a USING <, e DESC a USING >.

Ordenação de NULL:

  • NULLS LAST: NULLs são classificados após todos os valores não NULL (padrão para ASC).

  • NULLS FIRST: NULLs são classificados antes de todos os valores não NULL (padrão para DESC).

  • Por padrão, NULLs são tratados como maiores que valores não NULL.

  • Com uma cláusula USING, a posição padrão de NULL depende se o operador é menor que ou maior que.

As opções de ordenação aplicam-se apenas à expressão que elas seguem. Por exemplo, ORDER BY x, y DESC não é o mesmo que ORDER BY x DESC, y DESC.

Limitação: Quando ORDER BY é aplicado a um resultado UNION, INTERSECT ou EXCEPT, apenas nomes de colunas de saída ou números ordinais são permitidos — não expressões.

Cláusula LIMIT

A cláusula LIMIT restringe o número de linhas retornadas. FETCH FIRST é uma sintaxe equivalente do padrão SQL.

LIMIT { count | ALL }
OFFSET start

Sintaxe alternativa do padrão SQL:

FETCH FIRST count ROWS ONLY

Parâmetro

Descrição

count

Número máximo de linhas a retornar. Um valor NULL é tratado como LIMIT ALL (sem limite).

start

Número de linhas a pular antes de retornar linhas. Um valor NULL é tratado como OFFSET 0.

Quando ambos são especificados, start linhas são puladas antes de contar count linhas para retorno.

Use uma cláusula ORDER BY com LIMIT para resultados previsíveis. Sem ORDER BY, diferentes execuções podem retornar subconjuntos diferentes — este é um comportamento esperado, não um bug.

O planejador de consultas considera o LIMIT no plano, portanto, diferentes valores de LIMIT e OFFSET podem gerar ordens de linhas diferentes. Force uma ordem determinística com ORDER BY para paginação consistente.

Limitações

O Hologres é compatível com PostgreSQL, mas não suporta todos os recursos do SELECT do PostgreSQL. Aplicam-se as seguintes restrições:

  • Não há suporte para CTEs recursivas.

  • Não há suporte para SELECT DISTINCT em colunas do tipo de dados ARRAY.

  • FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE e FOR KEY SHARE não podem ser usados com resultados EXCEPT ou entradas EXCEPT.

Exemplos

Consulta básica

Recupere todas as colunas de uma tabela:

SELECT * FROM distributors ORDER BY name;

Junção de duas tabelas

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 com 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 (exato e aproximado)

Exato:

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

Aproximado:

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