SQL GROUP BY Declaración
¿Que es Group By? -Es una clausula que agrupa registros para consultas detalladas¿Cuando usamos "Group By"? -Esta clausula se utiliza para organizar registros en grupos y obtener un resumen de dicho grupo. Cabe destacar que las funciones de grupo solas, producen un valor de resumen por cada grupo especificado.
Ejemplo
SELECT SUM(SALARY), DEPARTMENT_ID
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;
Asi se solicita el salario que paga la empresa por cada Departamento.
La declaración de Group by
La Clausula GROUP BY se utiliza en conjunción con las funciones agregadas al grupo del conjunto de resultados de una o más columnas.
SELECT campo, funcion_agregada(campo) FROM tble_name GROUP BY campo,campo1,campoN ;
Base de datos de demostración
En este tutorial vamos a utilizar la base de datos de ejemplo Hr conocida.
Ejemplo
SELECT FIRST_NAME, AVG(SALARY)
FROM EMPLOYEES
GROUP BY FIRST_NAME;
Ejemplo sencillo usado como introducción
Funciones con Group By:
Si utiliza una función de grupo en un comunicado que no contiene
GROUP BY cláusula, que es equivalente a la agrupación en todas las filas.
Para argumentos numéricos, las funciones Varianza y desviación estándar devuelven un
DOBLE valor.
El SUM ()y AVG () devuelven un
DECIMAL valor para los argumentos de valor exacto (entero o
DECIMAL ), y una
DOBLE valor para los argumentos de aproximada-valor (
FLOAT o DOUBLE ). (Antes de MySQL 5.0.3,
SUM () y AVG ()retorno
DOBLE para todos los argumentos numéricos.)
El SUM () y AVG () funciones de agregado no funcionan con los valores temporales. (Se convierten los valores a números, perdiendo todo después de que el primer carácter no numérico.) Para evitar este problema, convertir a unidades numéricas, realice la operación agregada, y convertir de nuevo a un valor temporal. Ejemplos:
SELECT DEPARTMENT_ID, SUM(SALARY), AVG(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;
Esta instruccion nos da la suma y la media de los salarios por cada departamento.
Las funciones como SUM () o AVG () que esperan un argumento numérico echan el argumento en un número si es necesario. Para SET o ENUM valores, la operación de conversión hace que el valor numérico subyacente para ser utilizado.
Devuelve el valor medio de expr . El
DISTINCT opción se puede usar desde MySQL 5.0.3 para volver a la media de los valores distintos de expresion .
AVG () devuelve
NULL si no hay filas coincidentes.
SELECT FIRST_NAME, GROUP_CONCAT(FIRST_NAME) FROM EMPLOYEES GROUP BY FIRST_NAME;
Devuelve un recuento del número de
no- NULL valores de expr en las filas recuperadas por un
SELECT comunicado. El resultado es un
BIGINT valor.
COUNT () devuelve 0 si no hay registros coincidentes.
SELECT FIRST_NAME, COUNT(*)
FROM EMPLOYEES
GROUP BY FIRST_NAME;
COUNT (*) nos dice cuantas veces se repite cada FIRST_NAME en la instrucción.
COUNT (*) es algo diferente, ya que devuelve un recuento del número de filas recuperadas, si contienen o
no NULL valores.
COUNT (*) está optimizado para retornar muy rápidamente si el
SELECT recupera de una tabla, no se recuperan otras columnas, y allí no es DONDE cláusula. Por ejemplo:
SELECT COUNT(*) FROM EMPLOYEES;
*Numero de empleados.
COUNT (DISTINCTexpr,[expr...])
Devuelve un recuento del número de filas con distintas no
NULL expr valores.
COUNT (DISTINCT) devuelve 0 si no hay registros coincidentes.
SELECT COUNT( DISTINCT FIRST_NAME)
FROM EMPLOYEES
GROUP BY FIRST_NAME;
En MySQL, puede obtener el número de combinaciones de expresiones distintas que no contienen
NULL dando una lista de expresiones. En SQL estándar, tendría que hacer una concatenación de todas las expresiones dentro de
COUNT (DISTINCT ...) .
Esta función devuelve una cadena resultado con los no concatenados NULL los valores de un grupo. DevuelveNULL si no hay no- NULL valores. La sintaxis completa es la siguiente:
SELECT FIRST_NAME,
GROUP_CONCAT(FIRST_NAME)
FROM EMPLOYEES
GROUP BY FIRST_NAME;
Devuelve el valor máximo de expr .
MAX () puede tomar un argumento de cadena, en cuyo caso, se devuelve el valor máximo de la cadena. Consulte Sección 8.5.3, "Cómo utiliza MySQL los índices" .
El DISTINCT palabra clave se puede utilizar para encontrar el máximo de los valores distintos de expr , sin embargo, esto produce el mismo resultado que omitiendo
DISTINCT .
MAX () devuelve
NULL si no hay filas coincidentes.
SELECT DEPARTMENT_ID, MIN(SALARY),MAX(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;
Para
MAX () , MySQL actualmente compara
ENUM y
SET columnas por su valor de cadena en lugar de por la posición relativa de la cadena en el conjunto. Esto difiere de cómo
ORDER BY las compara. Se espera que esto se rectifique en una futura versión de MySQL.
Devuelve el valor mínimo de expr .
MIN () puede tomar un argumento de cadena, en cuyo caso, se devuelve el valor mínimo de cuerdas. Consulte Sección 8.5.3, "Cómo utiliza MySQL los índices" .
El DISTINCT palabra clave se puede utilizar para encontrar el mínimo de los valores distintos de expr , sin embargo, esto produce el mismo resultado que omitiendo
DISTINCT .
MIN () devuelve
NULL si no hay filas coincidentes.
SELECT DEPARTMENT_ID, MIN(SALARY),MAX(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;
Para
MIN () , MySQL actualmente compara
ENUM y
SET columnas por su valor de cadena en lugar de por la posición relativa de la cadena en el conjunto. Esto difiere de cómo
ORDER BY las compara. Se espera que esto se rectifique en una futura versión de
MySQL.
Devuelve la suma de expr . Si el juego de vuelta no tiene filas,
SUM () devuelve
NULL . El DISTINCT palabra clave puede utilizarse para sumar sólo los valores distintos de expr .
SUM () devuelve
NULL si no hay filas coincidentes.
SELECT DEPARTMENT_ID, SUM(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;
Modificadores de Group By:
ROLLUP/ WITH ROLLUP
La cláusula GROUP BY permite añadir un modificador WITH ROLLUP que provoca añadir registros extra al resumen de la salida. Estos registros representan operaciones de resumen de alto nivel ( o super agregadas ). ROLLUP por lo tanto le permite responder preguntas en múltiples niveles de análisis con una sola consulta.
SELECT FIRST_NAME, SUM(MANAGER_ID)
FROM EMPLOYEES
GROUP BY FIRST_NAME
WITH ROLLUP;
La línea super agregada con la suma total se identifica con el valor NULL en la columna Country_name .
ROLLUP tiene un efecto más complejo cuando hay múltiples columnas GROUP BY . En este caso, cada vez que hay un “break” (cambio en el valor) en cualquiera excepto la última columna de agrupación, la consulta produce registros super agregados extra.
Por ejemplo, sin ROLLUP, un resumen de la tabla COUNTRIES basado en Country_name y Region_id puede tener este aspecto:
SELECT DISTINCT COUNTRY_NAME,SUM(REGION_ID)
FROM COUNTRIES
GROUP BY COUNTRY_NAME,REGION_ID;
La salida indica valores resumen sólo en el nivel de análisis year/country/product . Cuando se añade ROLLUP , la consulta produce registros extra:
SELECT DISTINCT COUNTRY_NAME,SUM(REGION_ID)
FROM COUNTRIES
GROUP BY COUNTRY_NAME,REGION_ID
WITH ROLLUP;