Volver a la lista de artículos Artículos
Lectura de 6 minutos

Tutorial de SQL HAVING

Aprenda a utilizar la cláusula HAVING de SQL para filtrar grupos utilizando sus propias condiciones especificadas.

La cláusula HAVING de SQL suele ser un concepto difícil de entender, especialmente para los principiantes. Además, sus casos de uso específicos pueden ser difíciles de visualizar sin ejemplos concretos basados en conjuntos de datos del mundo real. En este tutorial, aprenderá a aplicar la cláusula HAVING de SQL para filtrar grupos de registros basados en condiciones específicas. Verá ejemplos en los que aplicamos este concepto para resolver problemas empresariales en un conjunto de datos realista.

La Función de la Cláusula HAVING de SQL

La cláusula SQL HAVING se utiliza normalmente con la cláusula GROUP BY para filtrar grupos de filas devueltas. Sólo cuando la condición especificada es TRUE se incluyen las filas en el grupo.

La cláusula SQL GROUP BY organiza los datos en grupos basados en valores comunes; se utiliza con mayor frecuencia para obtener información de resumen y calcular estadísticas agregadas. Si desea un repaso más profundo de este tema, consulte este artículo sobre SQL GROUP BY.

Puede haber cierta confusión sobre WHERE y HAVING, pero la diferencia es fácil de explicar. La cláusula WHERE aplica una condición en toda la columna filtrando filas individuales. No funciona con funciones agregadas como SUM() y AVG(). Por otro lado, HAVING pone condiciones de filtrado en los grupos creados por la cláusula GROUP BY. Puede utilizarse con funciones de agregación.

Por ejemplo, consideremos la siguiente tabla. Muestra una lista de clientes agrupados por ciudades en varios países. Si quisiéramos ver grupos de ciudades con 3 o más clientes, necesitaríamos una cláusula HAVING que satisfaga esta condición en cada una de las ciudades (es decir, los grupos).

CustomerIDCityCountry
009BerlinGermany
045BerlinGermany
101BerlinGermany
098BernSwitzerland
003BernSwitzerland
154Buenos AiresArgentina
111Buenos AiresArgentina
039Buenos AiresArgentina
191WallaPoland

En otras palabras, la cláusula HAVING es esencialmente una cláusula WHERE que opera sobre los registros devueltos por GROUP BY. (También tenemos una comparación más profunda entre HAVING y WHERE si está interesado en profundizar).

La sintaxis HAVING de SQL

HAVING no funcionará sin la cláusula GROUP BY. Debe seguir a la cláusula GROUP BY en una consulta y debe preceder a la cláusula ORDER BY (si está utilizando una). Sólo se devolverán los grupos que cumplan los criterios de HAVING.

Por ejemplo, probemos la siguiente consulta en la tabla customers tabla:

SELECT COUNT(CustomerID), City, Country
FROM Customers
WHERE Country = 'Brazil'
GROUP BY City, Country
HAVING COUNT(CustomerID) > 1

¿Qué ocurre en esta consulta?

  • En primer lugar, la cláusula WHERE filtra las filas aplicables para el país "Brasil".
  • En segundo lugar, la cláusula GROUP BY agrupa las entradas en función de los valores de las columnas City y Country.
  • Tercero, la cláusula HAVING filtra los grupos - en este caso, sólo estamos interesados en las ciudades brasileñas que tienen más de 1 cliente.

El curso LearnSQL.es SQL para principiantes cubre la sintaxis y la aplicación de la cláusula HAVING en un entorno atractivo e interactivo. Si quieres practicar, esta es mi recomendación. Pero primero, veamos más ejemplos de HAVING.

Ejemplos de HAVING en SQL

Vamos a sumergirnos en algunos ejemplos que presentan diferentes funciones agregadas para que podamos entender cómo funciona realmente la cláusula HAVING. Utilizaremos la siguiente tabla de clientes OrderDetails que tiene un total de 518 filas. Tiene un total de 518 filas de datos de pedidos directos. Esto incluye información como los pedidos Quantity y ProductID junto con un único OrderID para cada pedido.

OrderDetailIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
410249149
510249142
6102495140
518104432812

Como analista de datos, una de sus principales funciones sería obtener información sobre los datos de ventas. Exploraremos tres problemas sencillos destinados a encontrar algunos de esos conocimientos.

Ejemplo 1: HAVING con COUNT()

PROBLEMA: Listar todos los productos con más de 12 pedidos individuales realizados.

CONSULTA:

SELECT COUNT(ProductID), ProductID
FROM OrderDetails
GROUP BY ProductID
HAVING COUNT(ProductID) > 12

RESULTADO:

Number of Records: 5
COUNT(ProductID)ProductID
1431
1459
1362
1371
1472

Si no hubiéramos incluido la cláusula HAVING, esta consulta devolvería esencialmente el número de registros igual al número único de ProductIDs. Aquí, GROUP BY coloca los pedidos con el mismo ProductID en grupos. A continuación, la cláusula HAVING coloca la condición de filtrado en cada uno de esos grupos y devuelve los que tienen un recuento superior a 12.

Ejemplo 2: HAVING con SUM()

PROBLEMA: Listar todos los productos que han tenido más de 350 cantidades totales pedidas.

CONSULTA:

SELECT SUM(Quantity), ProductID
FROM OrderDetails
GROUP BY ProductID
HAVING SUM(Quantity) > 350
ORDER BY SUM(Quantity) DESC

RESULTADO:

Number of Records: 3
COUNT(ProductID)ProductID
45831
43060
36935

En el ejemplo anterior, GROUP BY agrupa de forma similar los pedidos por ProductID. Luego, la cláusula HAVING coloca la condición de filtrado (la suma de la columna Quantity debe ser superior a 350) en cada uno de esos grupos. Por último, ORDER BY devuelve los resultados en orden descendente.

Ejemplo 3: HAVING con AVG()

PROBLEMA: Listar todos los productos que han tenido más de 35 cantidades pedidas de media y al menos 4 pedidos realizados.

CONSULTA:

SELECT AVG(Quantity), COUNT(ProductID), ProductID
FROM OrderDetails
GROUP BY ProductID
HAVING AVG(Quantity) > 35 AND COUNT(ProductID) > 3
ORDER BY AVG(Quantity) DESC

RESULTADO:

Number of Records: 6
AVG(Quantity)ProductIDCOUNT(ProductID)
41.25234
41359
38.75584
35.836012
35.6445
35.11339

En el ejemplo 3, después de agrupar los pedidos por ProductID, la cláusula HAVING pone dos condiciones de filtrado en los grupos: una cantidad media de pedido superior a 35 y un número de pedidos individuales superior a 3.

Basándonos en los tres ejemplos anteriores, hemos aprendido que ProductID 31, por ejemplo, estaba incluido en el mayor número de pedidos individuales (14) y también tenía el mayor número de cantidades pedidas entre todos los pedidos realizados (458). Se trata sin duda de uno de los productos más populares de la tienda.

Además, ProductIDs 23, 35 y 58 tuvieron las mayores cantidades medias por pedido. Este tipo de información es muy valiosa, ya que permite a las empresas saber en qué productos centrarse y cómo comercializarlos.

Dominar la cláusula HAVING de SQL

Como acabamos de ver, la cláusula HAVING es indispensable para calcular valores agregados en grupos de datos. Por lo tanto, siempre se utiliza en combinación con una cláusula GROUP BY y restringe los datos en los registros agrupados en lugar de en los registros individuales.

Si quieres aprender más sobre el uso de la cláusula HAVING de SQL, prueba nuestro curso SQL para principiantes . Cubre la cláusula HAVING en detalle y explica más sobre la agrupación, el filtrado y el ordenamiento de los datos. También hay muchos problemas de práctica y cuestionarios para que te sientas realmente cómodo utilizando el SQL básico.