Tengo las siguientes dos tablas:
1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).
Quiero encontrar al profesor con la mayor 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 intento 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);
¿Cuál es la razón? Gracias.
Respuestas:
WHERE
La cláusula introduce una condición en filas individuales ;HAVING
La cláusula introduce una condición en las agregaciones , es decir, los resultados de la selección en los que se ha producido un único resultado, como conteo, promedio, mínimo, máximo o suma, 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 tantoHAVING
funciona correctamente.Como regla general, use
WHERE
antesGROUP BY
yHAVING
despuésGROUP BY
. Es una regla bastante primitiva, pero es útil en más del 90% de los casos.Mientras lo hace, es posible que desee volver a escribir su consulta utilizando la versión ANSI de la unión:
Esto eliminaría
WHERE
que se usara como una condición de unión theta .fuente
HAVING
opera en agregados. ComoCOUNT
es una función agregada, no puede usarla en unaWHERE
cláusula.Aquí hay algunas lecturas de MSDN sobre funciones agregadas.
fuente
Primero debemos conocer el orden de ejecución de las Cláusulas, es decir, DE> DÓNDE> AGRUPAR POR> TENER> DISTINTO> SELECCIONAR> ORDENAR POR. Dado que la Cláusula WHERE se ejecuta antes de la Cláusula GROUP BY, los registros no se pueden filtrar aplicando WHERE a los registros aplicados por GROUP BY .
"TENER es igual que la cláusula WHERE pero se aplica en registros agrupados".
primero la cláusula WHERE recupera los registros según la condición, luego la cláusula GROUP BY los agrupa en consecuencia y luego la cláusula HAVING recupera los registros del grupo según la condición de tener.
fuente
La cláusula WHERE se puede usar con las instrucciones SELECT, INSERT y UPDATE, mientras que HAVING solo se puede usar con la declaración SELECT.
WHERE filtra las filas antes de la agregación (GROUP BY), mientras que TENIENDO grupos de filtros después de las agregaciones.
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 de agregado se pueden usar en la cláusula HAVING.
Fuente
fuente
No vi un ejemplo de ambos en una consulta. Entonces este ejemplo podría ayudar.
Esto filtra la tabla primero por el Id. De la compañía, luego la agrupa (por país y ciudad) y, además, la filtra a las agregaciones de ciudades de México. El ID de compañía no era necesario en la agregación, pero pudimos usar DÓNDE para filtrar solo las filas que queríamos antes de usar GROUP BY.
fuente
No puede usar la cláusula where con funciones agregadas porque donde fetch registra en función de la condición, entra en la tabla registro por registro y luego recupera el registro en función de la condición que tenemos. Así que esa vez no podemos dónde 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:
Esto almacenará el resultSet en una memoria temporal, luego tener una cláusula realizará su trabajo. Entonces podemos usar fácilmente funciones agregadas aquí.
fuente
1. Podemos usar la función de agregado con la cláusula HAVING no mediante la cláusula WHERE, por ejemplo, min, max, avg.
2. La cláusula WHERE elimina la tupla de registro por tupla La cláusula HAVING elimina todo el grupo de la colección de grupos
La mayoría de las veces HAVING se usa cuando tiene grupos de datos y WHERE se usa cuando tiene datos en filas.
fuente