6.3 Fonctions à utiliser dans les clauses SELECT et WHERE
6 Référence du langage MySQL
Manuel de Référence MySQL 4.1 : Version Française
. Opérateurs et fonctions tout-types . Fonctions de chaînes de caractères . Fonctions numériques . Fonctions de dates et d'heures . Fonctions de transtypage . Autres fonctions ->Fonctions avec la clause GROUP BY
|
6.3.7 Fonctions avec la clause GROUP BY
Si vous utilisez une fonction de groupement avec une commande qui n'utilise
pas la clause
GROUP BY
, cela revient à regrouper toutes les lignes
ensembles.
-
COUNT(expr)
-
Retourne le nombre de valeurs non-nulles (
NULL
) dans les lignes lues par
la commande
SELECT
:
mysql> SELECT etudiant.nom_etudiant,COUNT(*) -> FROM etudiant,course -> WHERE etudiant.id_etudiant=course.id_etudiant -> GROUP BY nom_etudiant;
|
COUNT(*)
est légèrement différent car il retourne le nombre de lignes lues,
qu'elles contiennent ou pas la valeur
NULL
.
COUNT(*)
est optimisé pour retourner très rapidement le résultat si la commande
SELECT
n'opère que sur une table, qu'aucune autre valeur n'est calculée en même
temps, et qu'il n'y a pas de clause
WHERE
. Par exemple :
mysql> SELECT COUNT(*) FROM etudiant;
|
-
COUNT(DISTINCT expr,[expr...])
-
Retourne le nombre de lignes ayant des valeurs distinctes non-nulles (
NULL
) :
mysql> SELECT COUNT(DISTINCT resultat) FROM etudiant;
|
Avec MySQL, vos pouvez connaître le nombre de combinaison d'expressions distinctes qui ne
contiennent pas la valeur
NULL
en donnant une liste d'expressions.
En ANSI SQL, vous devriez faire la concaténation de toutes les expressions de clause
COUNT(DISTINCT ...)
.
-
AVG(expr)
-
Retourne la valeur moyenne de la colonne
expr
:
mysql> SELECT nom_etudiant, AVG(test_score) -> FROM etudiant -> GROUP BY nom_etudiant;
|
-
MIN(expr)
-
-
MAX(expr)
-
Retourne le minimum ou le maximum de l'expression
expr
.
MIN()
et
MAX()
acceptent aussi les chaînes comme argument ; dans ce cas, elles retournent
le minimum ou le maximum de la valeur de la chaîne. Comment MySQL utilise les index .
mysql> SELECT nom_etudiant, MIN(test_score), MAX(test_score) -> FROM etudiant -> GROUP BY nom_etudiant;
|
Dans
MIN()
,
MAX()
et les autres fonctions d'agrégat, MySQL compare
les colonnes de type
ENUM
et
SET
par la valeur de leur chaîne au lieu
de la position relative de la chaîne dans la liste. Cela sera rectifié.
-
SUM(expr)
-
Retourne la somme de l'expression
expr
. Notez que si aucune ligne n'est
sélectionnée, la fonction retournera NULL !
-
STD(expr)
-
-
STDDEV(expr)
-
Retourne la déviation standard de l'expression
expr
. C'est une extension à la norme ANSI SQL.
La fonction
STDDEV()
est fournie pour assurer la compatiblité avec Oracle.
-
BIT_OR(expr)
-
Retourne le
OR
bit-à-bit de l'expression
expr
. Les calculs sont effectués avec une
précision de 64 bits (
BIGINT
).
-
BIT_AND(expr)
-
Retourne le
AND
bit-à-bit de l'expression
expr
. Les calculs sont effectués avec une
précisioon de 64 bits (
BIGINT
).
MySQL a étendu l'utilisation de la clause
GROUP BY
. Vous pouvez utiliser des noms
de colonnes ou des expressions qui n'apparaissent pas dans la clause
GROUP BY
.
Elles prennent alors
n'importe quelle valeur possible dans ce groupe
.
Vous pouvez les utiliser pour améliorer les performances, en évitant de trier et
regrouper des éléments non critiques. Par exemple, vous n'avez pas besoin de faire de groupement
par
client.nom
dans la requête suivante :
mysql> SELECT order.custid,client.nom,MAX(payments) -> FROM order,client -> WHERE order.custid = client.custid -> GROUP BY order.custid;
|
En ANSI SQL, vous devez ajouter
client.nom
à la clause
GROUP BY
.
En MySQL, le nom est redondant si vous n'utilisez par le mode ANSI.
N'utilisez surtout pas cette caractéristique
si les colonnes que vous omettez
n'ont pas de valeur unique au sein du groupe! Vous obtiendriez des résultas incohérents.
Dans certains cas, vous pouvez utiliser
MIN()
et
MAX()
pour obtenir une
valeur d'une colonne spécifique, même si elle n'est pas unique. La fonction suivante
calcule la valeur de
column
dans la ligne contenant la plus petite valeur de la
colonne
sort
:
SUBSTR(MIN(CONCAT(RPAD(sort,6,' '),column)),7)
|
La ligne contenant la plus grande valeur d'un certain champ par rapport à un groupe .
Notez que si vous utilisez la version 3.22 de MySQL (ou plus récent), ou si vous essayez
d'utiliser le mode ANSI SQL, vous ne pouvez pas utiliser d'expressions dans les
clauses
GROUP BY
et
ORDER BY
. Vous pouvez contourner ces limitations
en utilisant un alias d'expression :
mysql> SELECT id,FLOOR(value/100) AS val FROM nom_de_table -> GROUP BY id,val ORDER BY val;
|
En MySQL version 3.23, vous pouvez faire :
mysql> SELECT id,FLOOR(value/100) FROM nom_de_table ORDER BY RAND();
|
|