Originariamente inviato da piero.mac
La clausola HAVING serve a selezionare ulteriormente dei record gia' scelti a priori con la clausola WHERE oppure ON delle JOIN. Tanto e' che se si immette in HAVING una condizione che invece si presume debba essere di tipo piu' generale, in modo silente MySQL la trasferisce in WHERE ottimizzando la query.
Ecco perche a volte non si capisce la differenza e apparentemente sembra che WHERE ed HAVING facciano la stessa cosa.
La grande diversita' e' che HAVING agisce anche su un ALIAS di campo... perche' viene risolto "dopo" che si e' effettuata la selezione dei record, mentre WHERE viene risolto "prima", e quindi l'ALIAS di campo ancora non esiste.
L'uso di HAVING e solitamente usato con le funzioni di raggruppamento, e quindi anche con GROUP BY, ma nulla vieta di usarlo per conto suo. Sempre che ci sia una logica nell'uso... per es.:
codice:
SELECT COUNT(*) AS tot
from tabella
where id > 1000
having tot < 100
Si avrebbe un result record solo se conteggiando gli id con valore > a 1000 questi siano numericamente inferiori a 100. Quale sarebbe la differenza? Sostanziale direi... COUNT() renderebbe "sempre" una riga con zero o con valore contato, con having la riga verra' resa "solo" se il risultato e' quello richiesto da HAVING.
Ovviamente salvo errori od omissioni.....