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,
« Expressions de valeurs »). 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,
« Alias de table et de colonne »). 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 aussi la Section 7.2.2, « Clause
WHERE »)
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 pourrait ê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. Dans ce cas, la
« suite de l'exécution » est
une spécification optionnelle du tri et l'application client
(c'est-à-dire les en-têtes de colonne pour l'affichage). 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 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.
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,
« Alias de table et de colonne »). 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 passé.
Après le traitement de la liste de sélection, la table résultant
pourrait être optionnellement sujet à 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 quelque 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.