Está en la página 1de 8

FILTRAR CÁLCULOS

DE TOTALIZACIÓN
SQL HAVING
Si se plantea ¿Qué ubicaciones del centro de mascotas tienen más de dos ejemplares? Ese dato
no existe en ninguna tabla sino que debe calcularse. En consecuencia, existe HAVING que filtra
los datos totalizados.
¿Qué datos nos piden? Las ubicaciones
¿Dónde están los datos? En la tabla mascotas
¿Qué requisitos deben cumplir los registros? Ubicaciones que contengan mascotas con alta en el
centro.
¿Cómo debemos agrupar los datos? Por ubicación
¿Qué requisito han de cumplir los datos totalizados? Que el número de ejemplares de las
ubicaciones sea mayor a dos.
SQL HAVING
SELECT UBICACION , count(*) as EJEMPLARES A fin de ser prácticos consideraremos la
FROM MASCOTAS clausula HAVING como una cláusula
WHERE para los cálculos de totalización. De
WHERE ESTADO = 'A’ modo que lo que filtraremos aquí serán cosa
del estilo: que la suma sea inferior a..., que la
GROUP BY UBICACION media sea igual a..., que el máximo sea
HAVING count(*) > 2 superior a...., o como en el ejemplo: que el
recuento de registros sea superior a dos.
Siempre sobre cálculos de totalización. Por lo
tanto si no hay cláusula GROUP BY, tampoco
habrá cláusula HAVING.
DIFERENCIA ENTRE WHERE Y
HAVING
Cuando el motor SQL recorre la tabla para obtener el resultado, ignora los registros que no
satisfacen la cláusula WHERE, en el caso anterior ignora los registros que el campo ESTADO no
contenga una 'A', y estos registros no son considerados para desarrollar el cálculo. Una vez el
motor SQL a recorrido toda la tabla y ha finalizado el cálculo, de las filas resultantes ocultará las
que no satisfacen la cláusula HAVING, por lo que en primer lugar: no se ahorra hacer el cálculo
para las filas de resultados no mostradas, de lo contrario no podría saber si cumplen o no la
condición de la cláusula HAVING, y en segundo lugar, este filtro se aplica en la fase final del
proceso que ejecuta el motor SQL, y siempre sobre las filas de resultados escrutando los datos
totalizados (COUNT, SUM, MAX, ...), limitándose a mostrar o no una fila de resultado en
función de las condiciones establecidas en dicha cláusula.
Ejemplos
¿Qué ubicaciones del centro de mascotas tienen tan solo un ejemplar?

 select UBICACION , count(*) as EJEMPLARES
    from MASCOTAS
   where ESTADO = 'A'
group by UBICACION
  having count(*) = 1
Ejercicio
Usando el operador BETWEEN, construye una consulta que devuelva las ubicaciones del
centro de mascotas que tiene entre 2 y 3 ejemplares.

SELECT UBICACION, count(*) 
FROM `MASCOTAS` 
WHERE ESTADO="A" 
GROUP BY UBICACION 
HAVING count(*) BETWEEN 2 AND 3;
ORDER BY
Permite ordenar las filas de resultado por una o más columnas.
Siempre irá al final de una consulta y el motor SQL también será la última cosa que haga, a
efectos lógicos, antes de devolver el resultado.
Ejemplo:
Queremos obtener una lista ordenada de los empleados por sueldo, de modo que primero este
situado el de menor salario y por último el de mayor:
 SELECT NOMBRE,APELLIDOS,SALARIO
    FROM EMPLEADOS
ORDER BY SALARIO
Ejemplo
select *
    from MASCOTAS
  where ESPECIE = 'P'
order by ESTADO desc, NOMBRE asc

También podría gustarte