SQL: TENER versus DÓNDE
Tengo las siguientes dos tablas:
1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).
Quiero encontrar al profesor con 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.
WHERE
La cláusula introduce una condición en filas individuales ; HAVING
La cláusula introduce una condición sobre las agregaciones , es decir, los resultados de la selección en los que se ha producido un único resultado, como recuento, 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 que HAVING
funciona correctamente.
Como regla general, úselo WHERE
antes GROUP BY
y HAVING
después GROUP BY
. Es una regla bastante primitiva, pero ú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:
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
la que se utilizó como condición de unión theta .
Primero debemos conocer el orden de ejecución de las Cláusulas, es decir, DESDE > DÓNDE > GROUP BY > HAVING > DISTINCT > SELECT > ORDER BY. Dado que la cláusula WHERE se ejecuta antes que la cláusula GROUP BY, los registros no se pueden filtrar aplicando WHERE a los registros aplicados GROUP BY .
"HAVING es igual que la cláusula WHERE pero se aplica a 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.