Was ist der Unterschied zwischen Haben und WO?
Frage
ich in der falschen Art und Weise wird googeln müssen oder ich einen dummen Moment in der Zeit mit.
Was ist der Unterschied zwischen HAVING
und WHERE
in einer SQL SELECT
Aussage?
EDIT: Ich habe Steven Antwort als richtig markiert, da sie den Schlüssel Bit an Informationen auf dem Link enthalten:
Wenn
GROUP BY
nicht verwendet wird,HAVING
verhält sich wie eineWHERE
Klausel
Die Situation, die ich die WHERE
gesehen hatte in nicht GROUP BY
hat und wo meine Verwirrung begann. Natürlich, bis Sie das wissen Sie es in der Frage nicht angeben können.
Vielen Dank für alle Antworten, die sehr aufschlussreich waren.
Lösung
MIT gibt eine Suchbedingung für eine Gruppe oder eine Aggregatfunktion in SELECT-Anweisung verwendet wird.
Andere Tipps
Eigenschaften: verwendet wird Bedingungen überprüfen nach die Aggregation erfolgt
.
WO:. Verwendet wird Bedingungen vor zu überprüfen, die Aggregation erfolgt
Mit diesem Code:
select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Gibt Ihnen eine Tabelle aller Städte in MA und die Anzahl der Adressen in jeder Stadt.
Mit diesem Code:
select City, CNT=Count(1)
From Address
Where State = 'MA'
Group By City
Having Count(1)>5
Gibt Ihnen eine Tabelle der Städte in MA mit mehr als 5 Adressen und die Anzahl der Adressen in jeder Stadt.
Die Nummer eins Unterschied für mich: Wenn HAVING
aus der SQL-Sprache entfernt wurde dann das Leben auf mehr oder weniger wie vor gehen würde. Sicherlich müßten eine Minderheit Abfragen neu geschrieben werden, um eine abgeleitete Tabelle verwenden, CTE, usw., aber sie würden wohl leichter zu verstehen und als Ergebnis zu erhalten. Vielleicht Optimierer Code Anbieter müßte neu geschrieben werden, um dies zu berücksichtigen, wieder eine Chance für die Verbesserung innerhalb der Branche.
Jetzt für einen Moment betrachtet WHERE
aus der Sprache zu entfernen. Dieses Mal ist die Mehrheit von Abfragen in Existenz müßte ohne offensichtliches Alternative Konstrukt neu geschrieben werden. Coder würde kreativ zum Beispiel bekommen innere Verknüpfung bekannt, ein Tisch genau eine Zeile enthalten (z.B. DUAL
in Oracle) die ON
Klausel die vorherige WHERE
Klausel zu simulieren. Solche Konstruktionen wäre contrived; es wäre offensichtlich, es war etwas aus der Sprache fehlt und die Situation würde als Folge schlechter sein.
TL; DR können wir HAVING
morgen verlieren und es würde nicht schlechter, vielleicht besser sein, aber das gleiche kann nicht von WHERE
gesagt werden,
Aus den Antworten hier, so scheint es, dass viel Volk nicht erkennen, dass eine HAVING
Klausel ohne GROUP BY
Klausel verwendet werden. In diesem Fall wird die HAVING
Klausel auf den gesamten Tabellenausdruck angewandt und erfordert, dass nur Konstanten in der SELECT
Klausel erscheinen. Typischerweise wird die HAVING
Klausel Aggregate umfassen.
Dies ist nützlicher, als es klingt. Betrachten wir zum Beispiel diese Abfrage zu testen, ob die name
Spalte für alle Werte in T
einzigartig 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, dann mit dem Ergebnis eine einzelne Zeile des Wert 1
enthält, andernfalls wird das Ergebnis die leere Menge sein
Die HAVING-Klausel wurde hinzugefügt, um zu SQL, weil das Schlüsselwort WHERE nicht mit Aggregatfunktionen verwendet werden kann.
Sehen Sie sich diese w3schools Link für weitere Informationen
Syntax:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
Eine Abfrage wie folgt aus:
SELECT column_name, COUNT( column_name ) AS column_name_tally
FROM table_name
WHERE column_name < 3
GROUP
BY column_name
HAVING COUNT( column_name ) >= 3;
... kann neu geschrieben werden, um eine abgeleitete Tabelle mit (und das Weglassen des HAVING
) wie folgt aus:
SELECT column_name, column_name_tally
FROM (
SELECT column_name, COUNT(column_name) AS column_name_tally
FROM table_name
WHERE column_name < 3
GROUP
BY column_name
) pointless_range_variable_required_here
WHERE column_name_tally >= 3;
Der Unterschied zwischen den beiden ist, in der Beziehung zu der GROUP BY-Klausel:
-
WHERE vor GROUP BY kommt; SQL wertet die WHERE-Klausel, bevor es Gruppen Aufzeichnungen.
-
comes nach GROUP BY; SQL auswertet, DAS, nachdem es Gruppen Aufzeichnungen.
Referenzen
HAVING
wird verwendet, wenn Sie ein Aggregat wie GROUP BY
verwenden.
SELECT edc_country, COUNT(*)
FROM Ed_Centers
GROUP BY edc_country
HAVING COUNT(*) > 1
ORDER BY edc_country;
WHERE als eine Beschränkung auf der Menge von SQL zurückgegeben angewandt wird; es nutzt SQL des integrierten Satz oeprations und Indizes und daher ist der schnellste Weg von Ergebnismengen zu filtern. Verwenden Sie immer WHERE wann immer möglich.
zu haben, ist notwendig für einige Aggregate Filter. Es filtert die Abfrage nach SQL abgerufen hat, montiert und sortiert die Ergebnisse. Deshalb ist es viel langsamer als WHERE und soll außer in jenen Situationen vermieden werden, die sie benötigen.
SQL Server lassen Sie weg mit der Verwendung von MIT, auch wenn WHERE viel schneller wäre. Tun Sie es nicht.
WHERE-Klausel funktioniert nicht für die Aggregatfunktionen
bedeutet: Sie sind nicht wie diese verwenden sollten
Bonus: Tabellenname
SELECT name
FROM bonus
GROUP BY name
WHERE sum(salary) > 200
HIER Anstelle der Verwendung von WHERE-Klausel Sie verwenden müssen, DIE ..
ohne GROUP BY-Klausel, HAVING-Klausel funktioniert wie WHERE-Klausel
SELECT name
FROM bonus
GROUP BY name
HAVING sum(salary) > 200
Difference b / w WHERE
und HAVING
-Klausel:
Der Hauptunterschied zwischen WHERE
und HAVING
Klausel, WHERE
für Zeilenoperationen verwendet wird und HAVING
für Spaltenoperationen verwendet.
Warum brauchen wir HAVING
Klausel?
Wie wir wissen, können Aggregatfunktionen nur auf Spalten durchgeführt werden, so dass wir keine Aggregatfunktionen in WHERE
-Klausel verwenden. Deshalb verwenden wir Aggregatfunktionen in HAVING
Klausel.
Wenn GROUP BY
nicht verwendet wird, ist der WHERE
und HAVING
Klauseln im Wesentlichen gleichwertig.
Wenn jedoch GROUP BY
verwendet wird:
- Die
WHERE
Klausel wird verwendet, um ein Ergebnis zu filtern Datensätze aus. Das Filterung erfolgt, bevor irgendwelche Gruppierungen vorgenommen werden. - Die
HAVING
Klausel wird verwendet, um Filterwerte aus einer Gruppe (das heißt, zu überprüfen Bedingungen nach der Aggregation in Gruppen durchgeführt worden ist).
Ressource Hier
hatte ich ein Problem und fand einen anderen Unterschied zwischen WHERE
und HAVING
aus. Es ist nicht die gleiche Art und Weise wirkt auf indizierten Spalten.
WHERE my_indexed_row = 123
werden Zeilen zeigen und eine „ORDER ASC“ automatisch auszuführen auf andere indizierte Zeilen.
HAVING my_indexed_row = 123
zeigt alles von den ältesten „eingefügt“ Reihe zum neuesten, keine Reihenfolge.
Eine Möglichkeit, daran zu denken ist, dass die having-Klausel ist ein zusätzlicher Filter in die where-Klausel.
WHERE Klausel verwendet Filter Datensätze aus einer Folge. Der Filter erfolgt, bevor irgendwelche Gruppierungen vorgenommen werden. Ein von -Klausel wird verwendet, um Werte aus einer Gruppe zu filtern
In einer Aggregate-Abfrage (Jede Abfrage Wenn eine Aggregatfunktion verwendet wird) Prädikate in einem where-Klausel ausgewertet werden, bevor die aggregierten Zwischenergebnismenge erzeugt wird,
Prädikate in einer HAVING-Klausel werden das Gesamtergebnis eingestellt angewandt, nachdem es erzeugt wurde. Deshalb Prädikat Bedingungen auf die aggregierte Werte müssen in having-Klausel platziert werden, nicht in der Where-Klausel, und warum Sie in der Select-Klausel definiert Aliase in einer HAVING-Klausel verwenden können, aber nicht in einer Where-Klausel.
WHERE-Klausel für den Vergleich von Werten in der Basistabelle verwendet wird, während die HAVING-Klausel kann zur Filterung der Ergebnisse von Aggregatfunktionen in der Ergebnismenge der Abfrage verwendet werden Klicken Sie auf hier !
ich verwenden zu müssen, um eine Abfrage beschränke auf die Ergebnisse einer Aggregatfunktion basiert. Z.B. select * in blahblahblah Gruppe durch etwas mit count (ETWAS)> 0
hier .
der SQL-Standard verlangt, dass HAVING Referenz muss nur Spalten in der GROUP BY-Klausel oder Spalten verwendet in Aggregatfunktionen
in Bezug auf die WHERE-Klausel gegenüber, die auf Datenbankzeilen angewandt wird,
Während an einem Projekt arbeiten, das war auch meine Frage. Wie oben erwähnt, das HAVING prüft den Zustand auf dem Abfrageergebnis bereits gefunden. Aber WHERE ist für die Kontrolle Zustand während Abfrage ausgeführt wird.
Lassen Sie mich ein Beispiel geben, dies zu veranschaulichen. Angenommen, Sie eine Datenbanktabelle wie diese haben.
usertable {int Benutzer-ID, Datum Datefield, int dailyincome}
Nehmen wir an, die folgenden Zeilen sind in der Tabelle:
1, 2011-05-20, 100
1, 2011-05-21, 50
1, 2011-05-30, 10
2, 2011-05-30, 10
2, 2011-05-20, 20
Jetzt wollen wir die userid
s und sum(dailyincome)
deren sum(dailyincome)>100
Wenn wir schreiben:
SELECT Benutzer-ID, sum (dailyincome) FROM usertable WHERE sum (dailyincome)> 100 GROUP BY Benutzer-ID
Dies wird ein Fehler sein. Die richtige Abfrage wäre:
SELECT Benutzer-ID, sum (dailyincome) FROM usertable GROUP BY Benutzer-ID, DAS sum (dailyincome)> 100
Es kann sein, dass nur der Gegenstand „where“ ist eine Zeile, während das Thema „aufweisen“ eine Gruppe ist. Habe ich Recht?