Utilice SQL HAVING para filtrar los resultados resumidos de un GROUP BY. Especifica la condición de búsqueda para el grupo o agregado.
SQL HAVING solo se utiliza con SELECT. Se usa principalmente cuando un GROUP BY está presente, si uno no lo está, hay un solo grupo agregado implícito.
Sintaxis de la clausula SQL Having
Cuando se construye una instrucción SELECT usando SQL Having el orden es:
SELECT olumna_Name1, columna_Name2
FROM tabla
WHERE condición
GROUP BY columna
HAVING condición
ORDER by columna.
Entonces, ¿Qué queremos decir con que SQL HAVING filtra los resultados del resumen? Veamos un ejemplo:
Ejemplos de cláusula SQL HAVING en SQL
En este artículo, hemos tomado los siguientes ejemplos que lo ayudarán a usar la cláusula SQL HAVING con diferentes funciones agregadas de SQL:
Ejemplo 1: Tomemos la siguiente tabla Estudiante_detalle, que le ayuda a analizar la cláusula HAVING con la función agregada COUNT:
ID_No | Nombre | Marcas | Edad |
---|---|---|---|
1 | María | 91 | 20 |
2 | José | 60 | 19 |
3 | Mario | 82 | 17 |
4 | Ana | 92 | 18 |
5 | Pedro | 50 | 20 |
6 | Franklin | 88 | 18 |
7 | Antoni | 57 | 19 |
8 | Manuel | 64 | 20 |
Suponga que desea contar el número de estudiantes de la tabla anterior según su edad. Para ello, tienes que escribir la siguiente consulta:
SELECT COUNT (ID_No), Edad
FROM Estudiante_detalle
GROUP BY Edad;
La consulta anterior mostrará el siguiente resultado:
Contar (ID_No) | Edad |
---|---|
3 | 20 |
2 | 19 |
1 | 17 |
2 | 18 |
Ahora, suponga que desea mostrar la edad de aquellos estudiantes cuyo número de registro es mayor y es igual a 2. Para este caso, debe escribir la siguiente consulta con la cláusula SQL HAVING en SQL server:
SELECT COUNT(ID_No), Edad FROM Estudiante_detalle
GROUP BY Edad
HAVING COUNT(ID_No) >= 2 ;
El resultado de la consulta SQL anterior muestra la siguiente tabla en el resultado:
Contar (ID_No) | Edad |
---|---|
3 | 20 |
2 | 19 |
2 | 18 |
Función MIN con cláusula SQL HAVING:
Ejemplo 2: Tomemos la siguiente tabla de empleados , que lo ayuda a analizar la cláusula SQL HAVING con la función agregada MIN y MAX:
Emp_ID | Nombre | Salario | Emp_Dept |
---|---|---|---|
1001 | María | 9000 | Finanzas |
1002 | José | 4000 | HORA |
1003 | Mario | 3000 | Codificación |
1004 | Ana | 6000 | Codificación |
1005 | Pedro | 5000 | HORA |
1006 | Franklin | 10000 | Márketing |
1007 | Antoni | 4000 | Codificación |
1008 | Manuel | 8000 | Finanzas |
Si desea mostrar cada departamento y el salario mínimo en cada departamento, debe escribir la siguiente consulta:
SELECT MIN (Emp_Salario), Emp_Dept
FROM Empleados
GROUP BY Emp_Dept;
El resultado de la consulta anterior muestra el siguiente resultado:
MIN(Emp_Salario) | Emp_Dept |
---|---|
8000 | Finanzas |
4000 | HORA |
3000 | Codificación |
10000 | Márketing |
Ahora, suponga que desea mostrar solo aquellos departamentos cuyo salario mínimo de empleados es mayor a 4000. Para este caso, debe escribir la siguiente consulta con la cláusula SQL HAVING:
SELECCT MIN (Emp_Salario), Emp_Dept
FROM Empleados
GROUP BY Emp_Dept
HAVING MIN (Emp_Salario) > 4000 ;
La consulta SQL anterior muestra la siguiente tabla en el resultado:
MIN(Emp_Salario) | Emp_Dept |
---|---|
8000 | Finanzas |
10000 | Márketing |
Función MAX con cláusula SQL HAVING:
En la tabla de empleados anterior, si desea enumerar cada departamento y el salario máximo en cada departamento. Para ello, tienes que escribir la siguiente consulta:
SELECT MAX (Emp_Salario), Emp_Dept
FROM Empleados
GROUP BY Emp_Dept;
La consulta anterior mostrará el siguiente resultado:
MAX(Emp_Salario) | Emp_Dept |
---|---|
9000 | Finanzas |
5000 | HORA |
6000 | Codificación |
10000 | Márketing |
Ahora, suponga que desea mostrar solo aquellos departamentos cuyo salario máximo de empleados es inferior a 8000. Para este caso, debe escribir la siguiente consulta con la cláusula HAVING en SQL:
SELECT MAX (Emp_Salario), Emp_Dept
FROM Empleados
GROUP BY Emp_Dept
HAVING MAX (Emp_Salario) < 8000 ;
El resultado de la consulta SQL anterior muestra la siguiente tabla en el resultado:
MAX(Emp_Salario) | Emp_Dept |
---|---|
5000 | HORA |
6000 | Codificación |
Diferencia entre la cláusula HAVING y WHERE
La diferencia entre las cláusulas WHERE y HAVING en la base de datos es la pregunta más importante que se hace durante una entrevista de TI.
La siguiente tabla muestra las comparaciones entre estas dos cláusulas, pero la principal diferencia es que la cláusula WHERE usa la condición para filtrar registros antes de realizar cualquier agrupación, mientras que la cláusula HAVING usa la condición para filtrar valores de un grupo.
HAVING | WHERE |
---|---|
1. La cláusula HAVING se usa en los sistemas de bases de datos para obtener los datos/valores de los grupos de acuerdo con la condición dada. | 1. La cláusula WHERE se usa en los sistemas de bases de datos para obtener los datos/valores de las tablas de acuerdo con la condición dada. |
2. La cláusula HAVING siempre se ejecuta con la cláusula GROUP BY. | 2. La cláusula WHERE se puede ejecutar sin la cláusula GROUP BY. |
3. La cláusula HAVING puede incluir funciones agregadas de SQL en una consulta o declaración. | 3. No podemos usar la función agregada de SQL con la cláusula WHERE en las declaraciones. |
4. Solo podemos usar la instrucción SELECT con la cláusula HAVING para filtrar los registros. | 4. Mientras que podemos usar fácilmente la cláusula WHERE con instrucciones UPDATE, DELETE y SELECT. |
5. La cláusula HAVING se usa en consultas SQL después de la cláusula GROUP BY. | 5. La cláusula WHERE siempre se usa antes que la cláusula GROUP BY en consultas SQL. |
6. Podemos implementar esta cláusula SQL en operaciones de columna. | 6. Podemos implementar esta cláusula SQL en operaciones de fila. |
7. Es un post-filtro. | 7. Es un prefiltro. |
8. Se utiliza para filtrar grupos. | 8. Se utiliza para filtrar el único registro de la tabla. |