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.
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.
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 optionnel, mais seulement si le
nouveau nom de colonne ne correspond à aucun des mots-clés
PostgreSQL (voir Annexe C). Pour éviter une correspondance
accidentelle à un mot-clé, vous pouvez mettre le nom de colonne entre
guillemets. Par exemple, VALUE
est un mot-clé, ce qui
fait que ceci ne fonctionne pas :
SELECT a value, b + c AS somme FROM ...
mais ceci fonctionne :
SELECT a "value", b + c AS somme FROM ...
Pour 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.
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é.
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.