SQL: Verwenden von WHERE UND statt HAVING

8

Hier ist ein Beispiel für eine SQL-Anweisung, in der wir HAVING verwenden:

%Vor%

ist es nicht genau dasselbe, wenn wir das tun:

%Vor%

Was ist der Unterschied zwischen diesen beiden?

    
l--''''''---------'''''''''''' 01.07.2010, 16:28
quelle

9 Antworten

17

In Ihrem Beispiel sollten sie das Gleiche tun. Aber WHERE wird vor GROUP BY verarbeitet und hat daher keinen Zugriff auf aggregierte Werte (dh die Ergebnisse der Funktionen Min() , Max() usw.). HAVING wird nach GROUP BY verarbeitet und kann so verwendet werden, um die Ergebnismenge auf nur diejenigen zu beschränken, deren aggregierte Werte mit einem bestimmten Prädikat übereinstimmen.

    
Daniel Pryden 01.07.2010, 16:32
quelle
6

HAVING wird für Aggregate verwendet, z. B. HAVING SUM(column1) > 200 , WHERE nur für die Spalten, z. B. WHERE column1 < 20 .

    
Hank Gay 01.07.2010 16:31
quelle
4

In Ihrem Beispiel ist es dasselbe, weil Sie keine GROUP BY

haben

Andernfalls wird HAVING nach GROUP BY angewendet, das nach WHERE ...

angewendet wird

Wenn wir sagen, dass HAVING mit einem einfachen Filter ( x = 2 ) genau ist wie WHERE, weil x = 2 nur dann eine Bedeutung hat, wenn Sie darauf gruppiert sind. Normalerweise verwenden Sie HAVING für ein Aggregat (zB COUNT(*) > 2 ), das erst nach GROUP BY

angewendet werden kann     
gbn 01.07.2010 17:04
quelle
3

Nein, weil das für Aggregatfunktionen oder Gruppierung nach Klausel ist.

Zum Beispiel:

%Vor%

Die erste Abfrage würde nicht ausgeführt.

    
Bruno Costa 01.07.2010 16:31
quelle
3

Nein, sie sind völlig verschieden.

Bedingungen sind zum Gruppieren von Aggregatfunktionen. Sie werden berechnet, nachdem der aggregierte Wert berechnet wurde.

Beispiel:

%Vor%

Hier wird der having -Teil ausgewertet nachdem die Abfrage den count (1) -Wert für jede Gruppe berechnet hat.

    
Pablo Santa Cruz 01.07.2010 16:32
quelle
3

Wie andere (meistens) korrekt angegeben haben, wird in SQL die WHERE -Klausel vor der SELECT -Klausel ausgewertet, daher ist das Ergebnis einer gesetzten Funktion in der WHERE -Klausel "out of scope".

Zum Beispiel können Sie das NICHT tun:

%Vor%

, weil der Spaltenkorrelationsname TopScore nicht im Bereich für die WHERE -Klausel enthalten ist.

Natürlich könnten wir eine Unterabfrage verwenden:

%Vor%

Das Problem war, dass frühe Implementierungen von SQL (beginnend mit IBMs System R) keine Unterstützung für abgeleitete Tabellen hatten, daher wurde das nicht intuitive HAVING geboren.

Sie können die ganze traurige Geschichte in HAVING A Blunderful Time lesen (oder Wish You Were WHERE) von Hugh Darwen, von dem ich die obigen Beispiele ausgeliehen habe.

    
onedaywhen 01.07.2010 21:41
quelle
2

HAVING gibt eine Suchbedingung für eine Gruppe oder eine Aggregatfunktion an, die in einer SELECT-Anweisung verwendet wird.

Eine HAVING-Klausel ist wie eine WHERE-Klausel, sie gilt jedoch nur für Gruppen als Ganzes, während die WHERE-Klausel für einzelne Zeilen gilt.

Having Ссылка

    
dretzlaff17 01.07.2010 17:51
quelle
1

Funktioniert nur mit einer group by-Klausel und begrenzt Datensätze, nachdem sie gruppiert wurden.

    
Femaref 01.07.2010 16:32
quelle
-1

zu verwenden, wenn Sie eine Gruppenklausel benötigen. Sie erhalten einen Fehler ohne einen

    
kacalapy 01.07.2010 18:07
quelle

Tags und Links