7.3.13 Fonctions à utiliser dans les clauses GROUP BY

L'utilisation d'une fonction de regroupement dans une commande qui ne contient pas la clause GROUP BY est équivalent à regrouper toutes les lignes.

  • COUNT(expression ) Retourne le nombre de lignes non-NULL obtenue par une commande SELECT.
    mysql> select student.student_name,COUNT(*)
               from student,course
               where student.student_id=course.student_id
               GROUP BY student_name;
    

    COUNT(*) est optimisé pour compter très rapidement les lignes obtenues par un SELECT sur une seule table, sans qu'aucune autre colonne ne soit demandée, et sans clause WHERE . Par exemple :

    mysql> select COUNT(*) from student;
    
  • COUNT(DISTINCT expression ,[expression ...]) Retourne le nombre de ligne distinctes.
    mysql> select COUNT(DISTINCT results) from student;
    

    Avec MySQL il est possible d'obtenir le nombre de combinaison d'expressions distinctes en donnant une liste d'expression. E, ANSI SQL, il aurait fallu concaténer les expressions avec CODE(DISTINCT ..).

  • AVG(expression ) Retourne la moyenne des valeurs de expression .
    mysql> select student_name, AVG(test_score)
               from student
               GROUP BY student_name;
    
  • MIN(expression )
  • MAX(expression ) Retourne le minimum ou le maximum de expression . MIN() et MAX() peuvent travailler avec des chaînes. Dans ce cas, il retourne la chaîne minimum maximum .
    mysql> select student_name, MIN(test_score), MAX(test_score)
               from student
               GROUP BY student_name;
    
  • SUM(expression ) Retourne la somme de expression . Si l'ensemble n'a aucune ligne, le résultat est NULL!
  • STD(expression )
  • STDDEV(expression ) Retourne la déviation standard de expression . C'est une extension à la norme ANSI SQL. La fonction STDDEV() est fourni pour assurer la comptabilité avec les bases Oracle.
  • BIT_OR(expression ) Retourne le OU logique bit-à-bit, effectué sur expression . Ce calcul est fait sur 64 bits (précision de BIGINT).
  • BIT_AND(expression ) Retourne le ET logique bit-à-bit, effectué sur expression . Ce calcul est fait sur 64 bits (précision de BIGINT).

    MySQL permet une utilisation étendue de GROUP BY. Il est possible de faire des calculs sur des colonnes dans le SELECT même si elles n'apparaissent pas dans le GROUP BY . Cela est possible pour n'importe quelle valeur de ce groupe. Cela permet de gagner en performance en évitant de faire des regroupements ou des tris sur des valeurs inutiles. Par exemple, il n'y a pas besoin de faire un regroupement avec customer.name dans la requête suivante :

    mysql> select order.custid,customer.name,max(payments)
           from order,customer
           where order.custid = customer.custid
           GROUP BY order.custid;
    

    La norme ANSI SQL impose d'ajouter customer.name dans la clause GROUP BY . Avec MySQL, c'est redondant.

    Il ne faut pas utiliser cette particularité si les noms de colonnes ne sont pas unique dans le groupe courant.

    Dans certains cas, il est possible d'utiliser MIN() et MAX() pour obtenir la valeur d'une colonne spécifique, même si elle n'est pas unique. Par exemple, cette requête retourne la valeur de column, de la ligne qui contient la colonne sort la plus courte.

    substr(MIN(concat(sort,space(6-longueur(sort)),column),7,longueur(column)))
    

    Il faut noter que avec MySQL 3.22 (ou avant), ou en suivant la norme ANSI SQL, il ne faut pas utiliser d'expressions dans les clauses GROUP BY ou ORDER BY. Il faut alors contourner la difficulté en utilisant un alias.

    mysql> SELECT id,FLOOR(value/100) AS val FROM Nom_table
               GROUP BY id,val ORDER BY val;
    

    Avec MySQL 3.23, on peut écrire :

    mysql> SELECT id,FLOOR(value/100) FROM Nom_table ORDER BY RAND();