Documentation PostgreSQL 14.22 » Langage SQL » Requêtes » Listes de sélection

Précédent | Niveau supérieur | Suivant
7.2. Expressions de table | Sommaire | 7.4. Combiner des requêtes (`UNION`, `INTERSECT`, `EXCEPT`)

## 7.3. Listes de sélection

Comme montré dans la section précédente, l'expression de table pour la commande `SELECT` construit une table virtuelle intermédiaire en combinant les tables, vues, en éliminant les lignes, en groupant, etc. Cette table est finalement passée à la réalisation de la liste de sélection. Cette liste détermine les colonnes de la table intermédiaire à afficher.

### 7.3.1. Éléments de la liste de sélection

La forme la plus simple de liste de sélection est `*`. C'est un raccourci pour indiquer toutes les colonnes que l'expression de table produit. Sinon, une liste de sélection est une liste d'expressions de valeurs séparées par des virgules (comme défini dans la Section 4.2). Par exemple, cela pourrait être une liste des noms de colonnes :

    SELECT a, b, c FROM ...

Les noms de colonnes `a`, `b` et `c` sont soit les noms actuels des colonnes des tables référencées dans la clause `FROM`, soit les alias qui leur ont été donnés (voir l'explication dans Section 7.2.1.2). L'espace de nom disponible dans la liste de sélection est le même que dans la clause `WHERE` sauf si le regroupement est utilisé, auquel cas c'est le même que dans la clause `HAVING`.

Si plus d'une table a une colonne du même nom, le nom de la table doit aussi être donné, comme dans :

    SELECT tbl1.a, tbl2.a, tbl1.b FROM ...

En travaillant avec plusieurs tables, il est aussi utile de demander toutes les colonnes d'une table particulière :

    SELECT tbl1.*, tbl2.a FROM ...

Voir Section 8.16.5 pour plus d'informations sur la syntaxe `nom_table``.*`.

Si une expression de valeur arbitraire est utilisée dans la liste de sélection, il ajoute conceptuellement une nouvelle colonne virtuelle dans la table renvoyée. L'expression de valeur est évaluée une fois pour chaque ligne avec une substitution des valeurs de lignes avec les références de colonnes. Mais les expressions de la liste de sélection n'ont pas à référencer les colonnes dans l'expression de la table de la clause `FROM` ; elles pourraient être des expressions arithmétiques constantes, par exemple.

### 7.3.2. Labels de colonnes

Les entrées de la liste de sélection peuvent se voir affecter des noms pour la suite de l'exécution, peut-être pour référence dans une clause `ORDER BY` ou pour affichage par l'application cliente. Par exemple :

    SELECT a AS valeur, b + c AS sum FROM ...

Si aucun nom de colonne en sortie n'est spécifié en utilisant `AS`, le système affecte un nom de colonne par défaut. Pour les références de colonne simple, c'est le nom de la colonne référencée. Pour les appels de fonction, il s'agit du nom de la fonction. Pour les expressions complexes, le système générera un nom générique.

Le mot clé `AS` est habituellement optionnel mais dans certains cas où le nom de la colonne désirée correspond à un mot clé PostgreSQL, vous devez écrire `AS` ou placer le nom de la colonne entre guillemets doubles pour éviter toute ambiguïté. (Annexe C affiche les mots clés qui nécessitent que `AS` soit utilisé comme label de colonne.) Par exemple, `FROM` est un de ces mots clés, donc ceci ne fonctionnera pas :

    SELECT a, b + c AS somme FROM ...

mais ces deux-là fonctionnent :

    SELECT a AS from, b + c AS sum FROM ...
    SELECT a "from", b + c AS sum FROM ...

Pour mieux vous protéger de possibles ajouts futurs de mots-clés, il est recommandé de toujours écrire `AS` ou de mettre le nom de colonne de sortie entre guillemets.

### Note

Le nom des colonnes en sortie est différent ici de ce qui est fait dans la clause `FROM` (voir la Section 7.2.1.2). Il est possible de renommer deux fois la même colonne, mais le nom affecté dans la liste de sélection est celui qui sera passé.

### 7.3.3. `DISTINCT`

Après le traitement de la liste de sélection, la table résultante pourrait être optionnellement sujette à l'élimination des lignes dupliquées. Le mot-clé `DISTINCT` est écrit directement après `SELECT` pour spécifier ceci :

    SELECT DISTINCT liste_selection ...

(au lieu de `DISTINCT`, le mot-clé `ALL` peut être utilisé pour spécifier le comportement par défaut, la récupération de toutes les lignes).

Évidemment, les deux lignes sont considérées distinctes si elles diffèrent dans au moins une valeur de colonne. Les valeurs NULL sont considérées égales dans cette comparaison.

Autrement, une expression arbitraire peut déterminer quelles lignes doivent être considérées distinctes :

    SELECT DISTINCT ON (expression [, expression ...]) liste_selection ...

Ici, `expression` est une expression de valeur arbitraire, évaluée pour toutes les lignes. Les lignes dont toutes les expressions sont égales sont considérées comme dupliquées et seule la première ligne de cet ensemble est conservée dans la sortie. Notez que la « première ligne » d'un ensemble est non prévisible sauf si la requête est triée sur assez de colonnes pour garantir un ordre unique des colonnes arrivant dans le filtre `DISTINCT` (le traitement de `DISTINCT ON` parvient après le tri de `ORDER BY`).

La clause `DISTINCT ON` ne fait pas partie du standard SQL et est quelques fois considérée comme étant un mauvais style à cause de la nature potentiellement indéterminée de ses résultats. Avec l'utilisation judicieuse de `GROUP BY` et de sous-requêtes dans `FROM`, la construction peut être évitée, mais elle représente souvent l'alternative la plus agréable.