Comme d'autres l'ont (la plupart du temps) indiqué à juste titre, dans SQL la clause WHERE
est évaluée avant la clause SELECT
, donc le résultat d'une fonction de jeu est « hors de portée » dans la clause WHERE
.
Par exemple, vous ne pouvez pas faire ceci:
SELECT Subject, MAX(Mark) AS TopScore
FROM Exam_Marks
GROUP
BY Subject
WHERE TopScore <= 70;
parce que le nom de corrélation de la colonne TopScore
n'est pas dans la portée de la clause WHERE
.
Bien sûr, nous pourrions utiliser une sous-requête:
SELECT DT1.TopScore
FROM (
SELECT Subject, MAX(Mark) AS TopScore
FROM Exam_Marks
GROUP
BY Subject
) AS DT1
WHERE DT1.TopScore <= 70;
Le problème était, au début des implémentations de SQL (à partir avec le système R d'IBM) ne disposaient pas le support des tables dérivées, d'où est né le HAVING
unintuitive.
Vous pouvez lire toute l'histoire désolé dans HAVING A Blunderful Time (or Wish You Were WHERE) par Hugh Darwen, à partir de laquelle j'ai emprunté les exemples ci-dessus.
Pour mettre la réponse de Daniel d'une autre manière, la clause where s'applique à toutes les lignes du jeu de résultats. La clause having est appliquée aux groupes créés par une clause group by. Donc, si votre groupe se compose de column1 dans votre exemple et que les conditions étaient sur la colonne 1, alors l'où est le même que l'avoir, puisqu'une ligne est la même que le "groupe". – Anon246
@Strommy: Exactement. Et si pour une raison quelconque vous ne voulez pas utiliser 'HAVING', vous pouvez accomplir la même chose en utilisant un' SELECT' imbriqué et en utilisant la clause 'WHERE 'externe pour exprimer votre prédicat désiré. –