Der größte Unterschied für mich: Wenn HAVING
er 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 WHERE
aus 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. DUAL
in Oracle), indem sie die ON
Klausel verwenden, um die vorherige WHERE
Klausel 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 HAVING
morgen 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 HAVING
Klausel ohne GROUP BY
Klausel verwendet werden kann. In diesem Fall wird die HAVING
Klausel auf den gesamten Tabellenausdruck angewendet und erfordert, dass nur Konstanten in der SELECT
Klausel erscheinen. In der Regel umfasst die HAVING
Klausel Aggregate.
Dies ist nützlicher als es klingt. Betrachten Sie diese Abfrage beispielsweise, um zu testen, ob die name
Spalte 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 HAVING
Klausel wahr ist, ist das Ergebnis eine einzelne Zeile, die den Wert enthält 1
, andernfalls ist das Ergebnis die leere Menge.
HAVING
, währendWHERE
es sich um einen Voraggregationsfilter handelt .