5.1 Declaración HABER
Hay otro operador útil en SQL que se usa con GROUP BY
, se llama HAVING
.
En su significado, es completamente análogo al operador WHERE
. Solo WHERE
le permite establecer un filtro de fila antes de la agrupación y, con la ayuda, HAVING
puede establecer un filtro que se aplica a los registros después de la agrupación.
La vista general de la consulta cuando se utiliza la agrupación y el filtrado de los resultados de la agrupación es la siguiente:
SELECT columns
FROM table
WHERE condition
GROUP BY columns
HAVING condition
HAVING
solo se puede usar si la solicitud contiene GROUP BY
.
Escribamos una consulta donde mostramos el número de empleados contratados por año.
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
Y el resultado de esta consulta:
año_alquiler | total |
---|---|
2012 | 1 |
2013 | 1 |
2014 | 1 |
2015 | 2 |
2018 | 1 |
Y ahora excluimos de ella los años en que se contrataron uno o menos empleados. Ejemplo:
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
HAVING total > 1
Y el resultado de esta consulta:
año_alquiler | total |
---|---|
2015 | 2 |
5.3 Orden de ejecución de sentencias
Para escribir consultas SQL correctas y eficientes, debe comprender cómo las ejecuta el servidor SQL.
El procedimiento para realizar acciones está estrictamente regulado y no depende de su deseo. No puede reorganizar los operadores y obtener un orden diferente.
La consulta SQL se ejecuta en varias etapas en este orden.
- Etapa 1: obtención de filas
- Primero, se seleccionan todas las filas de la tabla especificada.
- Luego se les agregan campos calculados.
- Y luego, de todas las filas, solo quedan aquellas que satisfacen la condición.
WHERE
- Etapa 2 - agrupación
- A continuación, se aplica la agrupación a los resultados.
- Durante la agrupación, campos como
COUNT(*)
. - Finalmente, se aplica un filtro al resultado de la agrupación
HAVING
. - Etapa 3 - clasificación
- Las filas obtenidas en los pasos anteriores se ordenan usando
ORDER BY
.
Finalmente, el resultado se puede recortar con LIMIT
y OFFSET
.
GO TO FULL VERSION