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 eine WHERE 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.

War es hilfreich?

Lösung

  

MIT gibt eine Suchbedingung für eine   Gruppe oder eine Aggregatfunktion in SELECT-Anweisung verwendet wird.

Quelle

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.

 select-Anweisung Diagramm

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 userids und sum(dailyincome) deren sum(dailyincome)>100

bekommen

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top