Aprender a utilizar funciones agregadoras y group by en MySQL permite transformar datos crudos en valiosa información de negocio. Conocer cómo aplicar funciones como COUNT, SUM y AVG, y combinar todo ello con sentencias WHERE y HAVING, brinda claridad sobre datos específicos ideales para la toma de decisiones comerciales estratégicas.
¿Qué son y para qué sirven las funciones agregadoras en MySQL?
Las funciones agregadoras, como su nombre lo indica, combinan múltiples filas de datos y producen un resultado resumido. Algunas funciones frecuentes son:
COUNT: cuenta las filas que cumplen con cierta condición. Por ejemplo, select count(*) from products where price < 500; te dará la cantidad de productos con precios por debajo de 500 pesos.
SUM: calcula la suma total de valores en una columna numérica específica. Por ejemplo, sumando el stock disponible se obtiene la cantidad total de artículos disponibles originalmente.
AVG: muestra el promedio de valores en columnas numéricas, como calcular el precio promedio de productos.
Estas funciones son esenciales para extraer información práctica y comprensible de grandes cantidades de datos.
¿Cómo sacar provecho del ´case´ y ´group by´?
La cláusula GROUP BY permite agrupar filas según valores comunes en una columna específica, mientras que CASE permite definir resultados según condiciones concretas.
¿Cómo categorizar usando ´case´?
La estructura básica del comando CASE es así:
SELECT email,CASEWHEN email LIKE'%@gmail.com'THEN'Gmail'WHEN email LIKE'%@hotmail.com'THEN'Hotmail'ELSE'Otro proveedor'ENDAS proveedor
FROM clients;
Este código evalúa cada dirección de correo y asigna una categoría basada en su proveedor.
¿Qué sucede al combinar ´case´ con ´group by´?
Si deseas contar la cantidad de clientes según el proveedor de su correo electrónico, utiliza:
La combinación genera información organizada que muestra claramente la cantidad de cuentas de cada proveedor de correo existentes en la base de clientes.
La diferencia entre HAVING y WHERE en SQL radica en el momento en que se aplican:
WHERE se utiliza para filtrar filas antes de cualquier agrupamiento. Se aplica a las filas individuales de la tabla, es decir, antes de que se realice cualquier cálculo de agregaciones.
HAVING, en cambio, se utiliza para filtrar grupos de resultados después de que se han realizado las agregaciones. Se aplica a los resultados de la función GROUP BY.
En resumen, usa WHERE para condiciones en filas individuales y HAVING para condiciones en resultados agregados.
Para hacerlo mas dinamico, se podría buscar el string posterior al arroba y ya hacer el conteo, así eliminamos el ruido de otro proveedor de correo:
select
SUBSTRING_INDEX(email, '@', -1) AS proveedor,
COUNT(*) AS cantidad
from
clients
group by
proveedor
;
Muy util bro, agrege un ORDER BY cantidad DESC ; para que me muestre en orden descendiente la cantidad de emails
select SUBSTRING_INDEX(email, '@', -1) AS proveedor,
COUNT(*) AS cantidad from clients
group by proveedor
ORDER BY cantidad DESC ;
y con ASC para ver los que menos cantidad tienen:
Siguiendo los pasos de Sergio y Alan, me surgió la curiosidad de dejar solo el nombre del proveedor como el ejercicio que venimos haciendo en clases, y descubrí que también se puede aplicar como una cadena dentro de otra cadena.
SELECT SUBSTRING_INDEX (SUBSTRING_INDEX(email,'@',-1),'.',1) AS proveedor,
COUNT(*) AS cantidad
FROM clients
GROUP BY proveedor
ORDER BY cantidad DESC;
Las funciones de ventana en SQL son fundamentales para realizar cálculos en conjuntos de filas que están relacionadas entre sí. Aquí hay un resumen con ejemplos de las más importantes:
ROW_NUMBER(): Asigna un número único a cada fila de un conjunto de resultados.
SELECT email, ROW_NUMBER()OVER(ORDERBY email)AS row_num FROM clients;
RANK(): Similar a ROW_NUMBER(), pero permite que filas con valores iguales reciban el mismo rango.
SELECT email, RANK()OVER(ORDERBY total_purchases DESC)AS rank FROM clients;
DENSE_RANK(): Igual que RANK(), pero no deja huecos en los números.
SELECT email, DENSE_RANK()OVER(ORDERBY total_purchases DESC)AS dense_rank FROM clients;
Estas funciones permiten realizar análisis complejos y obtener información valiosa de los datos sin necesidad de subconsultas complicadas, facilitando la toma de decisiones empresariales.
Al usar funciones como COUNT, SUM y AVG, es importante evitar los siguientes errores comunes:
No usar cláusulas WHERE adecuadas: Esto puede llevar a contar o sumar registros que no sean relevantes, generando resultados erróneos.
No agrupar correctamente: Si se omite la cláusula GROUP BY, se perderá la capacidad de segmentar datos, llevando a resultados globales en lugar de específicos.
Ignorar valores NULL: Las funciones de agregación pueden ignorar estos valores, lo cual puede distorsionar los resultados. Es recomendable manejar adecuadamente estos casos.
No validar la lógica del negocio: Asegúrate de que los criterios de filtrado y agrupación reflejen correctamente los requerimientos del análisis de datos.
Estos aspectos son cruciales para obtener información precisa y útil.
Para establecer una condición en SQL que verifique si un valor es distinto de otro, se utiliza la cláusula WHERE junto con el operador <>. Por ejemplo, si deseas seleccionar registros donde el email no sea igual a un valor específico, la consulta sería:
SELECT*FROM clients WHERE email <>'ejemplo@dominio.com';
En este caso, se seleccionarán todos los registros de la tabla clients donde el email sea diferente a 'ejemplo@dominio.com'.
El IF en SQL se utiliza para ejecutar condiciones dentro de una consulta. Permite evaluar una expresión o condición y retornar resultados diferentes basados en si esa condición es verdadera o falsa. Por ejemplo, puedes usar IF para clasificar datos, como determinar si un email pertenece a Gmail, Hotmail, etc.
Esta función es útil para hacer consultas más dinámicas y personalizadas, lo que te ayuda a obtener información más específica de tus bases de datos.
Use WHERE for individual rows (like age, price, name)
Use HAVING for aggregated results (like COUNT(*), SUM(), AVG())
«Esto no es otra cosa que ruido y mucho cuidado porque, cuando tenemos muchos datos y no los operamos bien, tenemos ruido... y el ruido siempre es muy caro»
Son 62 correos con @kozey.com
esta chevere la clase.
Algunos ejercicios extra para practicar un poco mas:
Muestra el nombre del cliente que empiece con A y ademas sea tenga un email @gmail.com
SELECT name,
CASE
WHEN email LIKE '%@gmail.com' THEN 'Gmail'
WHEN email LIKE '%@hotmail.com' THEN 'Hotmail'
WHEN email LIKE '%@yahoo.com' THEN 'Yahoo'
ELSE 'Otro proveedor'
END AS PROVEEDOR
FROM clients
WHERE name LIKE 'a%' AND email LIKE '%@gmail.com';
Muestra el nombre del cliente que empiece con A y ademas sea tenga un email @hotmail.com
SELECT name,
CASE
WHEN email LIKE '%@gmail.com' THEN 'Gmail'
WHEN email LIKE '%@hotmail.com' THEN 'Hotmail'
WHEN email LIKE '%@yahoo.com' THEN 'Yahoo'
ELSE 'Otro proveedor'
END AS PROVEEDOR
FROM clients
WHERE name LIKE 'a%' AND email LIKE '%@hotmail.com';
Muestra el nombre del cliente que empiece con A y ademas sea tenga un email @yahoo.com
SELECT name,
CASE
WHEN email LIKE '%@gmail.com' THEN 'Gmail'
WHEN email LIKE '%@hotmail.com' THEN 'Hotmail'
WHEN email LIKE '%@yahoo.com' THEN 'Yahoo'
ELSE 'Otro proveedor'
END AS PROVEEDOR
FROM clients
WHERE name LIKE 'a%' AND email LIKE '%@yahoo.com';
Muestra de forma agrupada el PROVEEDOR y el TOTAL_CLIENTES
SELECT
``CASE
`` ``WHEN email LIKE '%@gmail.com' THEN 'Gmail'
`` ``WHEN email LIKE '%@hotmail.com' THEN 'Hotmail'
`` ``WHEN email LIKE '%@yahoo.com' THEN 'Yahoo'
`` ``ELSE 'Otro Proveedor'
``END AS PROVEEDOR,
``COUNT(*) AS TOTAL_CLIENTES
FROM clients
GROUP BY PROVEEDOR
ORDER BY TOTAL_CLIENTES ASC;
Muestra el nombre del cliente que empiece con A y ademas sea tenga un email de Otro proveedor
SELECT name,
CASE
WHEN email LIKE '%@gmail.com' THEN 'Gmail'
WHEN email LIKE '%@hotmail.com' THEN 'Hotmail'
WHEN email LIKE '%@yahoo.com' THEN 'Yahoo'
ELSE 'Otro proveedor'
END AS PROVEEDOR
FROM clients
WHERE name LIKE 'a%'
``AND email NOT LIKE '%@gmail.com'
`` ``AND email NOT LIKE '%@hotmail.com'
`` ``AND email NOT LIKE '%@yahoo.com';
Muestra de forma agrupada el PROVEEDOR y el TOTAL_CLIENTES con el nombre de las personas que empiecen con 'a'
SELECT
``CASE
`` ``WHEN email LIKE '%@gmail.com' THEN 'Gmail con A'
`` ``WHEN email LIKE '%@hotmail.com' THEN 'Hotmail con A'
`` ``WHEN email LIKE '%@yahoo.com' THEN 'Yahoo con A'