GROUP BY
La cláusula SQL que colapsa las filas que comparten un valor en una sola fila por grupo, de modo que funciones de agregación como COUNT, SUM y AVG calculan por grupo y no sobre toda la tabla.
La regla con la que tropiezan los principiantes: toda columna del SELECT debe formar parte de la agrupación o ser una agregación. MySQL permitió durante años lo contrario y devolvía un valor arbitrario, fuente de más errores silenciosos que casi cualquier otra cosa. WHERE filtra antes de agrupar y HAVING después, por eso solo HAVING puede comparar contra una agregación. El motor elige entre agregación por hash y ordenación según el tamaño y los índices. Las extensiones GROUPING SETS, ROLLUP y CUBE producen varios niveles de agrupación en una sola pasada, el cimiento mismo de los informes OLAP. Las funciones de ventana hacen algo distinto: agregan sin colapsar las filas.