La differenza numero uno per me: se HAVINGfosse rimosso dal linguaggio SQL, la vita andrebbe avanti più o meno come prima. Certamente, una query di minoranza dovrebbe essere riscritta usando una tabella derivata, CTE, ecc. Ma sarebbe probabilmente più facile da capire e mantenere come risultato. Forse il codice di ottimizzazione dei fornitori dovrebbe essere riscritto per tener conto di ciò, ancora una volta un'opportunità di miglioramento nel settore.
Ora considera per un momento la rimozione WHEREdalla lingua. Questa volta la maggior parte delle query esistenti dovrebbe essere riscritta senza un ovvio costrutto alternativo. I programmatori dovrebbero diventare creativi, ad esempio il join interno di una tabella nota per contenere esattamente una riga (ad esempio DUALin Oracle) utilizzando la ONclausola per simulare la WHEREclausola precedente . Tali costruzioni sarebbero inventate; sarebbe ovvio che mancava qualcosa nella lingua e di conseguenza la situazione sarebbe peggiorata.
TL; DR potremmo perdere HAVINGdomani e le cose non sarebbero andate peggio, forse meglio, ma lo stesso non si può dire WHERE.
Dalle risposte qui, sembra che molte persone non si rendano conto che una HAVINGclausola può essere usata senza una GROUP BYclausola. In questo caso, la HAVINGclausola viene applicata all'intera espressione della tabella e richiede che nella SELECTclausola compaiano solo le costanti . In genere la HAVINGclausola coinvolgerà aggregati.
Questo è più utile di quanto sembri. Ad esempio, considerare questa query per verificare se la namecolonna è univoca per tutti i valori in T:
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
Sono possibili solo due risultati: se la HAVINGclausola è vera, il risultato sarà una singola riga contenente il valore 1, altrimenti il risultato sarà l'insieme vuoto.
HAVINGè un filtro post-aggregazione, mentreWHEREè un filtro pre-aggregazione.