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;
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();