La differenza numero uno per me: se HAVING
fosse 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 WHERE
dalla 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 DUAL
in Oracle) utilizzando la ON
clausola per simulare la WHERE
clausola precedente . Tali costruzioni sarebbero inventate; sarebbe ovvio che mancava qualcosa nella lingua e di conseguenza la situazione sarebbe peggiorata.
TL; DR potremmo perdere HAVING
domani 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 HAVING
clausola può essere usata senza una GROUP BY
clausola. In questo caso, la HAVING
clausola viene applicata all'intera espressione della tabella e richiede che nella SELECT
clausola compaiano solo le costanti . In genere la HAVING
clausola coinvolgerà aggregati.
Questo è più utile di quanto sembri. Ad esempio, considerare questa query per verificare se la name
colonna è 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 HAVING
clausola è 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.