PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 15.8 » Langage SQL » Requêtes » Listes de sélection

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.