WHERE
est utilisé pour sélectionner les données dans les tables d'origine en cours de traitement.
HAVING
est utilisé pour filtrer les données dans le jeu de résultats qui a été produit par la requête. Cela signifie qu'il peut référencer des valeurs agrégées et des alias dans le SELECT
clause.
Par exemple, peut écrire :
SELECT t1.val - t2.val diff
FROM t1 JOIN t2 ON (some expression)
HAVING diff > 10
Cela ne fonctionnerait pas avec WHERE
parce que diff
est un alias, et non l'une des colonnes de la table d'origine. Vous pourriez écrire à la place :
SELECT t1.val - t2.val diff
FROM t1 JOIN t2 ON (some expression)
WHERE t1.val - t2.val > 10
mais il se peut qu'il doive alors effectuer toutes les soustractions deux fois :une fois pour sélectionner et une autre fois pour produire le jeu de résultats.