Documentation PostgreSQL 8.0.25 | ||||
---|---|---|---|---|
Précédent | Arrière rapide | Chapitre 9. Fonctions et opérateurs | Avance rapide | Suivant |
Les fonctions d'agrégat calculent une seule valeur résultant d'un ensemble de valeurs en entrée. Tableau 9-37 affiche les fonctions d'agrégat intégrées. Les considérations spéciales sur la syntaxe des fonctions d'agrégat sont expliquées dans Section 4.2.7. Consultez Section 2.7 pour un supplément d'informations introductives.
Tableau 9-37. Fonctions d'agrégat
Il devrait être noté qu'en dehors de count
, ces
fonctions renvoient une valeur NULL si aucune ligne n'est sélectionnée. En
particulier, une somme (sum
) sur aucune ligne renvoie
NULL et non pas zéro. La fonction coalesce
pourrait
être utilisée pour substituer des zéros aux valeurs NULL quand cela est
nécessaire.
Note : Les agrégats booléens
bool_and
etbool_or
correspondent aux agrégats standards du SQLevery
etany
ousome
. Comme pourany
etsome
, il semble qu'il y a une ambiguïté dans la syntaxe standard :SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;Ici,
ANY
peut être considéré à la fois comme une sous-requête ou comme un agrégat si l'expression de sélection ne renvoie qu'une ligne. Du coup, le nom standard ne peur être donné à ces agrégats.
Note : Les utilisateurs habitués à travailler avec d'autres systèmes de gestion de bases de données SQL pourraient être surpris par les caractéristiques de performances de certains fonctions d'agrégat avec PostgreSQL lorsque l'agrégat est appliqué à la table entière (autrement dit, pas de clause WHERE). En particulier, une requête identique à
SELECT min(col) FROM matable;sera exécuté par PostgreSQL en utilisant un parcours séquentiel de la table entière. D'autres systèmes de bases de données pourraient optimiser de telles requêtes en utilisant un index sur la colonne si celui-ci est disponible. De même, les fonctions d'agrégat
max()
etcount()
requièrent toujours un parcours séquentiel si elles s'appliquent à la table entière avec PostgreSQL.PostgreSQL ne peut pas implémenter facilement cette optimisation parce qu'elle autorise aussi les requêtes d'agrégat définies par l'utilisateur. Comme
min()
,max()
etcount()
sont définies en utilisant l'API générique des fonctions d'agrégat, rien n'est prévu pour les cas spéciaux lors de l'exécution de ces fonctions sous certaines circonstances.Heureusement, il existe un contournement simple de
min()
etmax()
. la requête montrée ci-dessous est équivalent à la requête ci-dessus, si ce n'est qu'elle prend avantage de l'index B-tree s'il existe sur cette colonne.SELECT col FROM matable ORDER BY col ASC LIMIT 1;Une requête similaire (obtenue en substituant DESC avec ASC dans la requête ci-dessus) peut être utilisé à la place de
max()
).Malheureusement, il n'existe pas de requête triviale similaire pouvant être utilisée pour améliorer les performances de
count()
si cela s'applique à la table entière.
Précédent | Sommaire | Suivant |
Fonctions et opérateurs sur les tableaux | Niveau supérieur | Expressions de sous-expressions |