WHERE
é usado para selecionar dados nas tabelas originais que estão sendo processadas. HAVING
é usado para filtrar dados no conjunto de resultados que foi produzido pela consulta. Isso significa que ele pode fazer referência a valores agregados e aliases no SELECT
cláusula. Por exemplo, pode escrever:
SELECT t1.val - t2.val diff
FROM t1 JOIN t2 ON (some expression)
HAVING diff > 10
Isso não funcionaria usando
WHERE
porque diff
é um alias, não uma das colunas da tabela original. Você poderia escrever em vez disso:SELECT t1.val - t2.val diff
FROM t1 JOIN t2 ON (some expression)
WHERE t1.val - t2.val > 10
mas então ele pode ter que fazer todas as subtrações duas vezes:uma para selecionar e novamente para produzir o conjunto de resultados.