9.15. Fonctions d'agrégat

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

FonctionType d'argumentType de retourDescription
avg(expression) smallint, integer, bigint, real, double precision, numeric ou interval numeric pour tout argument de type entier, double precision pour tout argument en virgule flottante, sinon identique au type de données de l'argument la moyenne (au sens arithmétique) de toutes les valeurs en entrée
bit_and(expression) smallint, integer, bigint ou bit identique au type de données de l'argument le AND bit à bit de toutes les valeurs non NULL en entrée ou NULL s'il n'y en a pas
bit_or(expression) smallint, integer, bigint ou bit identique au type de données de l'argument le OR bit à bit de toutes les valeurs non NULL en entrée ou NULL s'il n'y en a pas
bool_and(expression) bool bool true si toutes les valeurs en entrée sont true, sinon false
bool_or(expression) bool bool true si au moins une valeur en entrée est true, sinon false
count(*) bigintnombre de valeurs en entrée
count(expression)tout typebigint nombre de valeurs en entrée pour lesquelles l'expression n'est pas NULL
every(expression) boolbooléquivalent à bool_and
max(expression)tout type numeric, string ou date/timeidentique au type en argument valeur maximale de l'expression pour toutes les valeurs en entrée
min(expression)tout type numeric, string ou date/timeidentique au type en argument valeur minimale de l'expression pour toutes les valeurs en entrée
stddev(expression) smallint, integer, bigint, real, double precision ou numeric double precision pour les arguments en virgule flottante, sinon numeric déviation standard des valeurs en entrée
sum(expression) smallint, integer, bigint, real, double precision, numeric ou interval bigint pour les arguments de type smallint ou integer, numeric pour les arguments de type bigint, double precision pour les arguments en virgule flottante, sinon identique au type de données de l'argument somme de l'expression pour toutes les valeurs en entrée
variance(expression) smallint, integer, bigint, real, double precision ou numeric double precision pour les arguments en virgule flottante, sinon numeric simple variance des valeurs en entrée (carré de la déviation)

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 et bool_or correspondent aux agrégats standards du SQL every et any ou some. Comme pour any et some, 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() et count() 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() et count() 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() et max(). 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.