Como otros han (en su mayoría) declaró correctamente, en SQL se evalúa la cláusula WHERE
antes de la cláusula SELECT
, por lo tanto, el resultado de una función de conjunto es 'fuera de alcance' en la cláusula WHERE
.
Por ejemplo, no se puede hacer esto:
SELECT Subject, MAX(Mark) AS TopScore
FROM Exam_Marks
GROUP
BY Subject
WHERE TopScore <= 70;
debido a que el nombre de correlación columna TopScore
no está en el ámbito de la cláusula WHERE
.
Por supuesto, podríamos utilizar una subconsulta:
SELECT DT1.TopScore
FROM (
SELECT Subject, MAX(Mark) AS TopScore
FROM Exam_Marks
GROUP
BY Subject
) AS DT1
WHERE DT1.TopScore <= 70;
El problema era que las primeras implementaciones de SQL (comenzando con el Sistema R de IBM) carecían de soporte para tablas derivadas, de ahí el poco intuitivo HAVING
nació.
Puede leer toda la historia triste en HAVING A Blunderful Time (or Wish You Were WHERE) por Hugh Darwen, de la que he tomado prestados los ejemplos anteriores.
Para poner la respuesta de Daniel de otra manera, la cláusula where se aplica a todas las filas en el conjunto de resultados. La cláusula having se aplica a los grupos creados por una cláusula group by. Entonces, si su grupo consta de la columna 1 en su ejemplo y las condiciones estaban en la columna 1, entonces donde es lo mismo que tener, ya que una fila es igual que el "grupo". – Anon246
@Strommy: Exactamente. Y si por alguna razón no quieres usar 'HAVING', puedes lograr lo mismo usando un' SELECT' anidado y usando la cláusula externa 'WHERE' para expresar tu predicado deseado. –