definicion sql where having

definicion - having sum sql



SQL-teniendo VS donde (7)

  1. La cláusula WHERE se puede usar con las sentencias SELECT, INSERT y UPDATE, mientras que HAVING se puede usar solo con la instrucción SELECT.

  2. WHERE filtra las filas antes de la agregación (GROUP BY), mientras que TENIENDO grupos de filtros después de las agregaciones.

  3. La función de agregado no se puede usar en la cláusula WHERE a menos que esté en una subconsulta contenida en la cláusula HAVING, mientras que las funciones agregadas se pueden usar en la cláusula HAVING.

Source

Tengo dos mesas:

1. Lecturers (LectID, Fname, Lname, degree). 2. Lecturers_Specialization (LectID, Expertise).

Quiero encontrar el profesor con más Especialización. Cuando intento esto, no funciona:

SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID AND COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);

Pero cuando pruebo esto, funciona:

SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);

¿Cual es la razon? Gracias.


1. Podemos usar la función agregada con la cláusula HAVING no mediante la cláusula WHERE, por ejemplo, mín., Máx., Prom.

2. WHERE cláusula elimina la tupla de registro por tupla HAVING cláusula elimina todo el grupo de la colección de grupo

En su mayoría HAVING se utiliza cuando tiene grupos de datos y WHERE se usa cuando tiene datos en filas.


No puede usar la cláusula where con funciones agregadas porque cuando obtiene registros en función de la condición, va al registro de la tabla por registro y luego obtiene el registro en función de la condición que le hemos dado. Entonces, ese momento no podemos donde la cláusula. Si bien tener cláusula funciona en el conjunto de resultados que finalmente obtenemos después de ejecutar una consulta.

Consulta de ejemplo:

select empName, sum(Bonus) from employees order by empName having sum(Bonus) > 5000;

Esto almacenará el conjunto de resultados en una memoria temporal, y luego la cláusula realizará su trabajo. Entonces, podemos usar fácilmente las funciones agregadas aquí.


No vi un ejemplo de ambos en una consulta. Entonces este ejemplo podría ayudar.

/** INTERNATIONAL_ORDERS - table of orders by company by location by day companyId, country, city, total, date **/ SELECT country, city, sum(total) totalCityOrders FROM INTERNATIONAL_ORDERS with (nolock) WHERE companyId = 884501253109 GROUP BY country, city HAVING country = ''MX'' ORDER BY sum(total) DESC

Esto filtra la tabla primero por companyId, luego la agrupa (por país y ciudad) y adicionalmente la filtra a solo agregaciones de la ciudad de México. La empresaId no era necesaria en la agregación, pero pudimos usar DONDE filtrar solo las filas que queríamos antes de usar GROUP BY.


Primero debemos conocer el orden de ejecución de las cláusulas, es decir, DESDE> DÓNDE> AGRUPAR POR> TENER> DISTINCIÓN> SELECCIONAR> ORDEN POR. Como la cláusula WHERE se ejecuta antes que la cláusula GROUP BY, los registros no pueden filtrarse aplicando WHERE a los registros aplicados GROUP BY .

"HAVING es igual que la cláusula WHERE pero se aplica en registros agrupados".

primero, la cláusula WHERE obtiene los registros en función de la condición, luego la cláusula GROUP BY los agrupa en consecuencia y luego la cláusula HAVING recupera los registros del grupo en función de la condición de tener.


HAVING opera en agregados. Como COUNT es una función agregada, no puede usarla en una cláusula WHERE .

Here''s algunas lecturas de MSDN sobre funciones agregadas.


WHERE cláusula WHERE introduce una condición en filas individuales ; HAVING cláusula HAVING introduce una condición en las agregaciones , es decir, los resultados de la selección donde un solo resultado, como recuento, promedio, mínimo, máximo o suma, se ha producido a partir de varias filas. Su consulta requiere un segundo tipo de condición (es decir, una condición en una agregación), por lo que HAVING funciona correctamente.

Como regla general, use WHERE antes de GROUP BY y HAVING after GROUP BY . Es una regla bastante primitiva, pero es útil en más del 90% de los casos.

Mientras lo hace, puede volver a escribir su consulta utilizando la versión ANSI de la unión:

SELECT L.LectID, Fname, Lname FROM Lecturers L JOIN Lecturers_Specialization S ON L.LectID=S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise)>=ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)

Esto eliminaría WHERE se usó como condición de unión theta .