Tous les produits
Search
Centre de documentation

Hologres:SELECT

Dernière mise à jour :Aug 11, 2026

La commande SELECT interroge les données de zéro ou plusieurs tables, en prenant en charge le filtrage, le regroupement, le tri, les jointures et les opérations ensemblistes.

Syntaxe

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

from_item est l'un des éléments suivants :

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

grouping_element est une expression : un nom de colonne, une constante, une fonction ou toute combinaison reliée par des opérateurs arithmétiques ou binaires.

Ordre de traitement

L'instruction SELECT traite les clauses selon l'ordre logique suivant :

  1. FROM : Le système évalue tous les éléments de la liste FROM (tables réelles ou virtuelles). Plusieurs éléments produisent une jointure croisée de toutes les tables sources.

  2. WHERE : Le système supprime les lignes qui ne satisfont pas la condition.

  3. GROUP BY et agrégats : Le système combine les lignes en groupes selon les valeurs correspondantes. Les fonctions d'agrégation calculent un résultat pour chaque groupe. Si une clause HAVING est présente, le système supprime les groupes qui ne répondent pas à la condition.

  4. SELECT : Les expressions de sortie calculent les lignes de résultat réelles à partir des lignes ou groupes sélectionnés.

  5. DISTINCT : Le système supprime les lignes en double de l'ensemble de résultats.

  6. UNION / INTERSECT / EXCEPT : Le système combine plusieurs résultats SELECT à l'aide d'opérateurs ensemblistes. Il supprime les doublons sauf si ALL est spécifié.

  7. ORDER BY : Le système trie les lignes selon l'ordre spécifié. Sans clause ORDER BY, les lignes sont renvoyées dans l'ordre le plus rapide à produire par le système.

  8. LIMIT (ou FETCH FIRST) / OFFSET : Le système ne renvoie qu'un sous-ensemble des lignes de résultat.

Clauses

Clause WITH

La clause WITH définit des expressions de table communes (CTE), c'est-à-dire des sous-requêtes nommées référencées dans la requête principale.

WITH query_name [ ( column_name [, ...] ) ] AS ( select )
Paramètre Description
query_name Nom de la CTE. Tout identifiant valide est accepté.
column_name Noms de colonnes correspondant aux valeurs renvoyées par la sous-requête, similaires à la sémantique AS dans une clause SELECT. La sous-requête peut être n'importe quelle requête SELECT valide.

Séparez plusieurs CTE par des virgules. Une CTE ultérieure peut référencer une CTE antérieure. Dans les requêtes suivantes, utilisez query_name directement comme une vue.

Sans liste de column_name, les noms de colonnes correspondent par défaut à ceux renvoyés par la sous-requête. Avec une liste de column_name, le nombre doit correspondre aux colonnes renvoyées par l'instruction SELECT.

Remarque

Les CTE récursives ne sont pas prises en charge.

Liste SELECT

La liste SELECT (entre les mots-clés SELECT et FROM) spécifie les expressions qui forment les lignes de sortie.

Ajoutez AS output_name après une expression pour nommer la colonne de sortie. Le mot-clé AS est facultatif, sauf si le nom entre en conflit avec un mot-clé PostgreSQL ; dans ce cas, utilisez AS ou placez le nom entre guillemets doubles. Sans nom explicite, PostgreSQL utilise le nom de la colonne pour les références simples ou génère un nom tel que ?column? pour les expressions complexes.

Référencez une colonne de sortie par son nom dans les clauses ORDER BY et GROUP BY. Dans les clauses WHERE et HAVING, utilisez l'expression complète à la place, car les noms de colonnes de sortie n'y sont pas reconnus.

Utilisez un astérisque (*) comme raccourci pour toutes les colonnes des lignes sélectionnées, ou table_name.* pour toutes les colonnes d'une table spécifique. Lors de l'utilisation de * ou table_name.*, AS ne peut pas renommer les colonnes de sortie.

Clause FROM

La clause FROM spécifie une ou plusieurs tables sources. Plusieurs tables sources produisent un produit cartésien (jointure croisée) de toutes les lignes. Généralement, une clause WHERE avec des conditions de jointure restreint le résultat à un petit sous-ensemble du produit cartésien.

La clause FROM prend en charge les éléments suivants :

Élément Description
table_name Nom d'une table ou d'une vue existante, éventuellement qualifié par le schéma.
alias Autre nom pour un élément FROM. Les alias simplifient les requêtes et résolvent l'ambiguïté dans les auto-jointures. Lorsqu'un alias est fourni, le nom réel de la table ou de la fonction est masqué. Par exemple, avec FROM foo AS f, le reste de la requête doit faire référence à l'élément en tant que f, et non foo.
select Une sous-instruction SELECT dans la clause FROM agit comme une table temporaire pendant la durée de la requête. Placez la sous-instruction SELECT entre parenthèses et fournissez un alias.
function_name Un appel de fonction dans la clause FROM agit comme une table temporaire. Cela est particulièrement utile pour les fonctions renvoyant des ensembles, bien que toute fonction soit autorisée. Fournissez un alias comme pour une table, et éventuellement une liste d'alias de colonnes pour renommer les attributs du type de retour composite de la fonction, y compris toute colonne ajoutée par ORDINALITY. Combinez plusieurs appels de fonction en un seul élément FROM en les plaçant entre ROWS FROM( ... ). La sortie concatène la première ligne de chaque fonction, puis la deuxième ligne, et ainsi de suite. Les fonctions produisant moins de lignes remplissent les positions manquantes par des valeurs NULL. Le nombre total de lignes correspond au maximum produit par n'importe quelle fonction unique.
join_type Décrit dans Types de jointure.
join_condition Expression évaluant une valeur booléenne (similaire à une clause WHERE) qui spécifie quelles lignes correspondent dans une jointure.
USING (a, b, ...) Raccourci pour ON left_table.a = right_table.a AND left_table.b = right_table.b .... USING garantit également qu'une seule copie de chaque colonne correspondante apparaît dans la sortie de la jointure.
NATURAL Raccourci pour une clause USING qui liste toutes les colonnes portant des noms identiques dans les deux tables.

Types de jointure

Pour les types de jointure INNER et OUTER, spécifiez exactement une condition de jointure : NATURAL, ON join_condition, ou USING (join_column [, ...]). CROSS JOIN n'accepte pas de condition de jointure.

Sans parenthèses, les jointures s'emboîtent de gauche à droite. JOIN a une priorité plus élevée que les virgules dans la liste FROM. Utilisez des parenthèses pour contrôler l'ordre d'imbrication.

Type de jointure Comportement
[INNER] JOIN Renvoie toutes les combinaisons de lignes des deux tables qui satisfont la condition de jointure.
LEFT [OUTER] JOIN Renvoie toutes les lignes correspondantes, plus une copie de chaque ligne non appariée de la table de gauche, étendue avec des valeurs NULL dans les colonnes de droite. Seule la condition JOIN détermine quelles lignes correspondent ; les conditions externes s'appliquent ensuite.
RIGHT [OUTER] JOIN Renvoie toutes les lignes correspondantes, plus chaque ligne non appariée de la table de droite, étendue avec des valeurs NULL à gauche. Équivalent à une LEFT OUTER JOIN avec les tables inversées.
FULL [OUTER] JOIN Renvoie toutes les lignes correspondantes, plus chaque ligne non appariée de la table de gauche (étendue avec des valeurs NULL à droite), plus chaque ligne non appariée de la table de droite (étendue avec des valeurs NULL à gauche).
CROSS JOIN Produit un simple produit cartésien, équivalent à INNER JOIN ON (TRUE). Aucune condition de jointure n'est autorisée.

Clause WHERE

La clause WHERE facultative filtre les lignes du résultat.

WHERE condition
Paramètre Description
condition Toute expression qui évalue un résultat booléen. Le système supprime les lignes qui ne satisfont pas cette condition de la sortie. Une ligne satisfait la condition lorsque la substitution de ses valeurs réelles aux références de variables renvoie true.

Clause GROUP BY

La clause GROUP BY facultative condense les lignes partageant les mêmes valeurs d'expression de regroupement en une seule ligne de résumé.

GROUP BY grouping_element [, ...]

L'expression grouping_element peut être un nom de colonne d'entrée, le nom ou le numéro ordinal d'une colonne de sortie de la liste SELECT, ou une expression formée à partir de valeurs de colonnes d'entrée. Si un nom est ambigu, GROUP BY l'interprète comme un nom de colonne d'entrée plutôt que comme un nom de colonne de sortie.

Si un élément de regroupement contient GROUPING SETS, ROLLUP ou CUBE, la clause GROUP BY définit plusieurs ensembles de regroupement indépendants. Cela équivaut à un UNION ALL de sous-requêtes avec des clauses GROUP BY individuelles pour chaque ensemble de regroupement.

Les fonctions d'agrégation calculent sur toutes les lignes de chaque groupe, produisant une seule valeur par groupe. Sans clause GROUP BY, la requête traite toutes les lignes sélectionnées comme un seul groupe.

Ajoutez une clause FILTER à un appel de fonction d'agrégation pour inclure uniquement les lignes correspondant à la condition de filtre dans l'entrée de cet agrégat.

Lorsqu'une clause GROUP BY ou une fonction d'agrégation est présente, les expressions de la liste SELECT ne peuvent pas référencer des colonnes non groupées, sauf au sein d'une fonction d'agrégation ou lorsque la colonne non groupée dépend fonctionnellement des colonnes groupées. Une dépendance fonctionnelle existe lorsque les colonnes groupées incluent la clé primaire (ou un sous-ensemble de celle-ci) de la table contenant la colonne non groupée.

Toutes les fonctions d'agrégation sont calculées avant toute expression scalaire dans la clause HAVING ou la liste SELECT. Une expression CASE ne peut pas ignorer le calcul d'une fonction d'agrégation.

Clause HAVING

La clause HAVING filtre les groupes produits par GROUP BY. La syntaxe correspond à celle de WHERE, mais HAVING opère sur des lignes groupées plutôt que sur des lignes individuelles.

HAVING condition [, ...]

Utilisez HAVING pour filtrer sur les résultats d'agrégation. Par exemple, HAVING sum(length) < interval '5 hours' supprime les groupes où la longueur totale est supérieure ou égale à 5 heures.

Remarque

Les noms de colonnes de sortie ne peuvent pas être référencés dans la clause HAVING. Utilisez l'expression complète à la place.

CUBE, ROLLUP et GROUPING SETS

Ces sous-clauses étendent GROUP BY pour définir plusieurs ensembles de regroupement dans une seule requête.

CUBE

CUBE génère des sous-totaux pour toutes les combinaisons des colonnes de regroupement spécifiées. Pour n expressions, CUBE produit 2^n groupes : toutes les combinaisons de valeurs de colonnes de dimension ainsi que les valeurs agrégées des lignes de base correspondantes.

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

Par exemple, CUBE (a, b, c) produit 2^3 = 8 groupes. Les lignes regroupées par toutes les n expressions sont des lignes régulières ; toutes les autres sont des lignes super-agrégées.

ROLLUP

ROLLUP renvoie un sous-total pour chaque groupe et un total général pour tous les groupes.

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

GROUPING SETS

GROUPING SETS spécifie exactement quels ensembles de regroupement doivent être calculés. Contrairement à CUBE ou ROLLUP, il ne génère pas toutes les combinaisons possibles, ce qui le rend plus efficace lorsque seuls des groupes spécifiques sont nécessaires.

GROUPING SETS ( grouping_element [, ...] )

Clause DISTINCT

SELECT DISTINCT supprime toutes les lignes en double de l'ensemble de résultats, en conservant une ligne par groupe de doublons.

Remarque

SELECT DISTINCT sur les colonnes du type de données ARRAY n'est pas pris en charge.

SELECT DISTINCT accountid FROM table;

COUNT DISTINCT

COUNT DISTINCT compte le nombre de valeurs distinctes dans une colonne. Une valeur apparaissant plusieurs fois n'est comptée qu'une seule fois. Les valeurs NULL sont exclues du comptage.

Comptage exact :

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

Comptage approximatif :

Le COUNT DISTINCT exact peut être gourmand en ressources. Hologres fournit approx_count_distinct comme alternative approximative moins gourmande en ressources :

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

Clause UNION

UNION calcule l'union ensembliste des lignes renvoyées par deux instructions SELECT.

select_statement UNION [ ALL | DISTINCT ] select_statement
Paramètre Description
select_statement Toute instruction SELECT sans clauses ORDER BY, LIMIT, FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE ou FOR KEY SHARE. Si la sous-expression est placée entre parenthèses, ORDER BY et LIMIT peuvent y être attachés. Sans parenthèses, ces clauses s'appliquent à l'ensemble du résultat UNION.
UNION Renvoie les lignes qui apparaissent dans l'un ou l'autre des ensembles de résultats, ou dans les deux. Les deux instructions SELECT doivent produire le même nombre de colonnes, et les colonnes correspondantes doivent avoir des types de données compatibles. Le système supprime les lignes en double sauf si ALL est spécifié. ALL empêche la suppression des doublons, ce qui est généralement plus rapide ; utilisez ALL lorsque cela est possible. Spécifiez DISTINCT explicitement pour supprimer les doublons. Le système évalue plusieurs opérateurs UNION dans la même requête de gauche à droite, sauf si des parenthèses modifient l'ordre.

Clause INTERSECT

INTERSECT calcule l'intersection ensembliste des lignes renvoyées par deux instructions SELECT.

select_statement INTERSECT [ ALL | DISTINCT ] select_statement
Paramètre Description
select_statement Toute instruction SELECT sans clause ORDER BY ou LIMIT.
INTERSECT Renvoie les lignes qui apparaissent dans les deux ensembles de résultats. Le système supprime les doublons sauf si ALL est spécifié. Avec ALL, une ligne apparaissant m fois dans la table de gauche et n fois dans la table de droite apparaît min(m, n) fois dans le résultat. Spécifiez DISTINCT explicitement pour supprimer les doublons. Le système évalue plusieurs opérateurs INTERSECT de gauche à droite, sauf si des parenthèses modifient l'ordre. INTERSECT a une priorité plus élevée que UNION. Par exemple, A UNION B INTERSECT C est évalué comme A UNION (B INTERSECT C).

Clause EXCEPT

EXCEPT calcule la différence ensembliste : les lignes du résultat SELECT de gauche qui ne se trouvent pas dans le résultat SELECT de droite.

select_statement EXCEPT [ ALL | DISTINCT ] select_statement
Paramètre Description
select_statement Toute instruction SELECT sans clause ORDER BY ou LIMIT.
EXCEPT Renvoie les lignes du résultat de gauche qui n'apparaissent pas dans le résultat de droite. Le système supprime les doublons sauf si ALL est spécifié. Avec ALL, une ligne apparaissant m fois dans la table de gauche et n fois dans la table de droite apparaît max(m - n, 0) fois dans le résultat. Spécifiez DISTINCT explicitement pour supprimer les doublons. Le système évalue plusieurs opérateurs EXCEPT de gauche à droite, sauf si des parenthèses modifient l'ordre. EXCEPT a la même priorité que UNION.
Remarque

FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE et FOR KEY SHARE ne peuvent pas être utilisés avec les résultats EXCEPT ou toute entrée EXCEPT.

Clause ORDER BY

La clause ORDER BY facultative trie les lignes de résultat selon une ou plusieurs expressions.

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

Les lignes sont triées d'abord par l'expression la plus à gauche, puis par les expressions suivantes pour départager les égalités. Les lignes égales sur toutes les expressions sont renvoyées dans un ordre dépendant de l'implémentation.

Chaque expression peut être :

  • Le nom ou le numéro ordinal d'une colonne de sortie de la liste SELECT.

  • Une expression arbitraire formée à partir de valeurs de colonnes d'entrée.

Le numéro ordinal fait référence à la position de la colonne de sortie (de gauche à droite), ce qui est utile pour les colonnes sans noms uniques. L'attribution d'un nom avec AS est généralement préférable.

Lorsqu'une expression ORDER BY est un nom simple qui correspond à la fois à un nom de colonne de sortie et à un nom de colonne d'entrée, ORDER BY utilise le nom de la colonne de sortie. Cela diffère de GROUP BY, qui utilise le nom de la colonne d'entrée dans la même situation. Cette incohérence existe pour la compatibilité avec la norme SQL.

Direction du tri :

  • Ajoutez ASC (croissant, par défaut) ou DESC (décroissant) après n'importe quelle expression.

  • Alternativement, utilisez une clause USING avec un opérateur de tri qui est un membre inférieur ou supérieur d'une famille d'opérateurs B-tree. ASC est généralement équivalent à USING <, et DESC à USING >.

Ordre des valeurs NULL :

  • NULLS LAST : les valeurs NULL sont triées après toutes les valeurs non NULL (par défaut pour ASC).

  • NULLS FIRST : les valeurs NULL sont triées avant toutes les valeurs non NULL (par défaut pour DESC).

  • Par défaut, les valeurs NULL sont traitées comme supérieures aux valeurs non NULL.

  • Avec une clause USING, la position NULL par défaut dépend du fait que l'opérateur soit inférieur ou supérieur.

Les options de tri s'appliquent uniquement à l'expression qui les suit. Par exemple, ORDER BY x, y DESC n'est pas identique à ORDER BY x DESC, y DESC.

Limitation : Lorsque ORDER BY est appliqué à un résultat UNION, INTERSECT ou EXCEPT, seuls les noms de colonnes de sortie ou les numéros ordinaux sont autorisés, et non les expressions.

Clause LIMIT

La clause LIMIT restreint le nombre de lignes renvoyées. FETCH FIRST est une syntaxe équivalente conforme à la norme SQL.

LIMIT { count | ALL }
OFFSET start

Syntaxe alternative conforme à la norme SQL :

FETCH FIRST count ROWS ONLY
Paramètre Description
count Nombre maximal de lignes à renvoyer. Une valeur NULL est traitée comme LIMIT ALL (aucune limite).
start Nombre de lignes à ignorer avant de renvoyer les lignes. Une valeur NULL est traitée comme OFFSET 0.

Lorsque les deux sont spécifiés, le système ignore les lignes start avant de compter les lignes count à renvoyer.

Utilisez une clause ORDER BY avec LIMIT pour obtenir des résultats prévisibles. Sans ORDER BY, différentes exécutions peuvent renvoyer différents sous-ensembles ; il s'agit d'un comportement attendu, et non d'un bug.

Le planificateur de requêtes intègre LIMIT dans le plan, de sorte que différentes valeurs LIMIT et OFFSET peuvent produire différents ordres de lignes. Imposez un ordre déterministe avec ORDER BY pour une pagination cohérente.

Limitations

Hologres est compatible avec PostgreSQL mais ne prend pas en charge toutes les fonctionnalités SELECT de PostgreSQL. Les restrictions suivantes s'appliquent :

  • Les CTE récursives ne sont pas prises en charge.

  • SELECT DISTINCT sur les colonnes du type de données ARRAY n'est pas pris en charge.

  • FOR NO KEY UPDATE, FOR UPDATE, FOR SHARE et FOR KEY SHARE ne peuvent pas être utilisés avec les résultats EXCEPT ou les entrées EXCEPT.

Exemples

Requête de base

Récupérez toutes les colonnes d'une table :

SELECT * FROM distributors ORDER BY name;

Jointure de deux tables

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

Clause 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 avec 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 (exact et approximatif)

Exact :

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

Approximatif :

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