7.3. Listes de sélection

Comme cela a été vu dans la section précédente, l'expression de table pour la commande SELECT construit une table virtuelle intermédiaire en combinant les tables et les vues, en éliminant des lignes, en réalisant des groupements, etc. Cette table est finalement transmise pour traitement à 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 * qui émet 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 Section 4.2). Cela peut, par exemple, être une liste de 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 un regroupement est utilisé, auquel cas c'est le même que dans la clause HAVING.

Si plusieurs tables ont 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 peut aussi être utile de demander toutes les colonnes d'une table particulière :

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

(Voir aussi Section 7.2.2.)

Si une expression de valeur arbitraire est utilisée dans la liste de sélection, cela ajoute conceptuellement une nouvelle colonne virtuelle à la table renvoyée. L'expression de valeur est évaluée une fois pour chaque ligne, les valeurs de lignes étant substituées pour chaque référence de colonnes. Mais les expressions de la liste de sélection n'ont pas à faire référence aux colonnes de l'expression de table issue de la clause FROM ; elles pourraient, par exemple, aussi bien être des expressions arithmétiques constantes.

7.3.2. Labels de colonnes

Les entrées dans la liste de sélection peuvent se voir affecter des noms pour la suite du traitement. La << suite du traitement >> dans le cas présent est une spécification optionnelle du tri et l'application client (les en-têtes de colonne pour l'affichage, par exemple). Ainsi :

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

Si aucun nom de colonne en sortie n'est spécifié par l'utilisation de AS, le système affecte un nom 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 engendrera un nom générique.

Note : Le nommage des colonnes en sortie est ici différent de celui qui est fait dans la clause FROM (voir Section 7.2.1.2). Ce tube vous permettra en fait de renommer deux fois la même colonne, mais le nom choisi dans la liste de sélection est celui qui sera retenu.

7.3.3. DISTINCT

Après le traitement de la liste de sélection, la table résultante peut faire optionnellement l'objet de l'élimination des duplicats. Le mot clé DISTINCT est écrit directement après SELECT pour activer cela :

SELECT DISTINCT liste_selection ...

(A la place de DISTINCT, le mot ALL peut être utilisé pour sélectionner 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 par au moins une valeur de colonne. Les valeurs nulles sont considérées égales dans cette comparaison.

Alternativement, une expression arbitraire peut permettre de déterminer les lignes à considérer 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 dupliquées et seule la première ligne de cet ensemble est conservée dans la sortie. Il est notable que la << première ligne >> d'un ensemble est imprévisible sauf si la requête est triée sur assez de colonnes pour garantir une ordre unique des colonnes arrivant dans le filtre DISTINCT. (Le traitement par DISTINCT ON survient après le tri par ORDER BY.)

La clause DISTINCT ON ne fait pas partie du standard SQL. Elle est souvent considérée comme de mauvais style du fait de la nature potentiellement indéterminée de ses résultats. L'utilisation judicieuse de GROUP BY et de sous-requêtes dans la clause FROM permet d'éviter cette construction, mais elle représente souvent l'alternative la plus pratique.