SQL HAVING: Sintaxis y cuándo utilizarlo

La cláusula HAVING se agregó a SQL porque la palabra clave WHERE no se podía usar con funciones agregadas.

En ocasiones, cuando estamos creando una consulta, necesitamos poner una condición para seleccionar valores que utilizando alguna función de agregación, por ejemplo, queremos saber cuántos clientes tenemos en la empresa con más de tres pedidos. Para ello utilizamos HAVING ya que no podemos realizar funciones de agregación con la cláusula WHERE.


Sintaxis de HAVING en SQL

A continuación mostramos la sintaxis para realizar una consulta utilizando la cláusula HAVING.

SELECT nombre_columna(s)
FROM nombre_tabla
WHERE condicion
GROUP BY nombre_columna(s)
HAVING condicion
ORDER BY nombre_columna(s);

Algunas de las funciones de agregación más utilizadas con HAVING son COUNT, SUM y MAX o MIN:

  • COUNT: Para por ejemplo seleccionar clientes que han realizado más de 10 pedidos.
  • MAX: Se utiliza mucho con HAVING, y es muy útil por ejemplo para seleccionar los clientes que han realizado su último pedido hace menos de una semana.
  • SUM: Esta función de agregación se puede utilizar con HAVING para seleccionar los clientes cuya suma de importes de compra sea superior a 1000 euros por ejemplo.

Ejemplo de la utilización de HAVING en una consulta de SQL

La siguiente declaración SQL enumera la cantidad de clientes en cada país. Solo incluir países con más de 10 clientes:

SELECT COUNT(ClienteID), Pais
FROM Clientes
GROUP BY Pais
HAVING COUNT(ClienteID)> 10;

La siguiente declaración SQL enumera la cantidad de clientes en cada país, ordenados de mayor a menor (solo incluye países con más de 15 clientes):

SELECT COUNT(ClienteID), Pais
FROM Clientes
GROUP BY Pais
HAVING COUNT(ClienteID) > 15
ORDER BY COUNT(ClienteID) DESC;

HAVING COUNT: Ejemplo

La siguiente declaración SQL enumera los empleados que han registrado más de 40 pedidos:

SELECT Empleados.Apellidos, COUNT(Pedidos.PedidoID) AS Numero_Pedido
FROM Pedidos
INNER JOIN Empleados ON Pedidos.EmpleadoID = Empleados.EmpleadoID
GROUP BY Apellidos
HAVING COUNT(Pedidos.PedidoID) > 40;

HAVING SUM: Ejemplo

A continuación puedes ver como utilizar HAVING con la función agregada SUM para seleccionar los Clientes que tengan pedidos con un importe > 100

SELECT Clientes.Apellidos, SUM(Pedidos.ImportePedido) AS Importe
FROM Pedidos
INNER JOIN Clientes ON Pedidos.ClienteID = Clientes.ClientesID
GROUP BY Apellidos
HAVING SUM(Pedidos.ImportePedido) > 100;

HAVING MAX: Ejemplo

A continuación se muestra un ejemplo en el que solo seleccionamos los clientes cuyo importe de compra más alto sea > 1000

SELECT * 
FROM Clientes
GROUP BY ClienteID
HAVING MAX(ImporteCompra) > 1000