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 WHEREle permite establecer un filtro de fila antes de la agrupación y, con la ayuda, HAVINGpuede 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
HAVINGsolo 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 LIMITy OFFSET.
GO TO FULL VERSION