Der größte Unterschied für mich: Wenn HAVINGer aus der SQL-Sprache entfernt würde, würde das Leben mehr oder weniger so weitergehen wie zuvor. Sicherlich müssten Minderheitsabfragen unter Verwendung einer abgeleiteten Tabelle, eines CTE usw. neu geschrieben werden, aber sie wären wahrscheinlich leichter zu verstehen und zu pflegen. Möglicherweise müsste der Optimierungscode der Anbieter neu geschrieben werden, um dies zu berücksichtigen. Dies ist wiederum eine Gelegenheit zur Verbesserung innerhalb der Branche.
Betrachten Sie nun für einen Moment das Entfernen WHEREaus der Sprache. Diesmal müsste die Mehrzahl der vorhandenen Abfragen ohne ein offensichtliches alternatives Konstrukt neu geschrieben werden. Codierer müssten kreativ werden, z. B. innerer Join zu einer Tabelle, von der bekannt ist, dass sie genau eine Zeile enthält (z. B. DUALin Oracle), indem sie die ONKlausel verwenden, um die vorherige WHEREKlausel zu simulieren . Solche Konstruktionen würden erfunden; Es wäre offensichtlich, dass etwas in der Sprache fehlte und die Situation sich dadurch verschlechtern würde.
TL; DR könnten wir HAVINGmorgen verlieren und die Dinge wären nicht schlechter, möglicherweise besser, aber das Gleiche kann man nicht sagen WHERE.
Aus den Antworten hier geht hervor, dass viele Leute nicht erkennen, dass eine HAVINGKlausel ohne GROUP BYKlausel verwendet werden kann. In diesem Fall wird die HAVINGKlausel auf den gesamten Tabellenausdruck angewendet und erfordert, dass nur Konstanten in der SELECTKlausel erscheinen. In der Regel umfasst die HAVINGKlausel Aggregate.
Dies ist nützlicher als es klingt. Betrachten Sie diese Abfrage beispielsweise, um zu testen, ob die nameSpalte für alle Werte in T: eindeutig ist.
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
Es gibt nur zwei mögliche Ergebnisse: Wenn die HAVINGKlausel wahr ist, ist das Ergebnis eine einzelne Zeile, die den Wert enthält 1, andernfalls ist das Ergebnis die leere Menge.
HAVING, währendWHEREes sich um einen Voraggregationsfilter handelt .