Wie ist die Ausführungsreihenfolge der Klausel "Gruppieren nach", "Haben" und "Wo" in SQL Server?


90

Ich bin nur verwirrt mit der Ausführungssequenz einer SQL-Abfrage, wenn wir GROUP BY und HAVING mit einer WHERE-Klausel verwenden. Welches wird zuerst ausgeführt? Wie ist die Reihenfolge?

Antworten:


181

in Ordnung:

FROM & JOIN s bestimmen und filtern Zeilen
WO mehr Filter in den Zeilen
GROUP BY diese Zeilen zu Gruppen zusammenfasst
HAVING Filter Gruppen
ORDER BY ordnet die verbleibenden Zeilen / Gruppen
LIMIT auf den verbleibenden Zeilen / Gruppen Filter


Gibt es einen Hinweis darauf?
Geshan

3
@ Geshan, schau inSET SHOWPLAN_ALL ON
KM.

Hallo, ich habe eine Frage. Wird die case-Anweisung, wenn die Bedingung die where-Bedingung überschreibt?
MAX

1
Was ist mit der Auswahlklausel? Ist es im letzten?
MAX

Kurze und prägnante Antwort! Danke dir!
Abhishek Ghosh

14

Hier ist die vollständige Sequenz für SQL Server:

1.  FROM
2.  ON
3.  JOIN
4.  WHERE
5.  GROUP BY
6.  WITH CUBE or WITH ROLLUP
7.  HAVING
8.  SELECT
9.  DISTINCT
10. ORDER BY
11. TOP

Aus der obigen Liste können Sie leicht die Ausführungsreihenfolge ersehen, GROUP BY, HAVING and WHEREderen:

1.  WHERE
2.  GROUP BY
3.  HAVING

Weitere Informationen dazu erhalten Sie von Microsoft


SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @valHier kommt ON nach dem Beitritt und select kommt zuerst, irgendwelche Erklärungen?
Noob

Dies ist nur die Syntax zum Schreiben einer SQL-Anweisung. Die von mir erwähnte Sequenz ist die tatsächliche Reihenfolge, die eine SQL-Engine auswertet. Das heißt, wenn Ihre Abfragesyntax korrekt ist, wertet die Engine FROMzuerst aus, dann ONund so weiter.
Md. Suman Kabir

1
@ShailajaGuptaKapoor Sie können diese blogs.x2line.com/al/archive/2007/06/30/3187.aspx
Md. Suman Kabir

7

WO ist zuerst, dann gruppieren Sie das Ergebnis der Abfrage, und nicht zuletzt wird die HAVING-Klausel verwendet, um das gruppierte Ergebnis zu filtern. Dies ist die "logische" Reihenfolge, ich weiß nicht, wie dies technisch in der Engine implementiert ist.


2
Es ist erwähnenswert, dass der Optimierer Klauseln von HAVING nach WHERE verschieben kann, wenn sie nicht von einem Aggregat abhängen. Dies hat keinen Einfluss auf die angezeigten Ergebnisse.
Damien_The_Unbeliever

2

Ich denke, es ist in der Engine implementiert, wie Matthias sagte: WO, GRUPPE NACH, HABEN

Ich habe versucht, online eine Referenz zu finden, die die gesamte Sequenz auflistet (dh "SELECT" wird ganz unten angezeigt), aber ich kann sie nicht finden. Es wurde in einem Buch "Inside Microsoft SQL Server 2005" beschrieben, das ich vor nicht allzu langer Zeit von Solid Quality Learning gelesen habe

Bearbeiten: Link gefunden: http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx


Sehr schöne Erklärung, die Sie verlinkt haben :-).
Sleske

1
Link ist tot. Wenn Sie das beheben können, wäre es großartig :)
Akash KC

2

In Oracle 12c können Sie Code in der folgenden Reihenfolge ausführen:

Where
Group By
Having

Oder

Where 
Having
Group by

1

Überlegen Sie, was Sie tun müssen, wenn Sie Folgendes implementieren möchten:

  • WO : Es ist notwendig, die JOIN-Operationen auszuführen.
  • GRUPPIERE NACH : Sie geben Group by an, um die Ergebnisse des Joins zu "gruppieren". Dies muss nach dem JOIN-Vorgang und nach der WHERE-Verwendung erfolgen.
  • HAVING : HAVING dient zum Filtern, wie in GROUP BY-Ausdrücken angegeben. Dann wird es nach dem GROUP BY ausgeführt.

Die Reihenfolge ist WO, GRUPPE NACH UND HABEN.


Was Sie hier erklärt haben, ist brillant. Es hat meine Zweifel an HAVING ausgeräumt. Zusammenfassend lässt sich sagen, dass GROUP BY & HAVING genauso funktioniert wie SELECT & WHERE. Die HAVING-Klausel wird immer für COMPLETE-Tabellendaten ausgeführt, wobei die GROUP BY-Bedingung im Bild und NICHT für GROUPED-Daten verwendet wird.
Naveen Kumar

1

In der unten angegebenen Reihenfolge

  1. VON & BEITRETEN
  2. WO
  3. GRUPPIERE NACH
  4. HABEN
  5. WÄHLEN
  6. SORTIEREN NACH
  7. GRENZE

0

Die Klausel kann vor / vor der Gruppe durch Klausel stehen.

Beispiel: Wählen Sie * FROM test_std; ROLL_NO SNAME DOB TEACH


     1 John       27-AUG-18 Wills     
     2 Knit       27-AUG-18 Prestion  
     3 Perl       27-AUG-18 Wills     
     4 Ohrm       27-AUG-18 Woods     
     5 Smith      27-AUG-18 Charmy    
     6 Jony       27-AUG-18 Wills     
       Warner     20-NOV-18 Wills     
       Marsh      12-NOV-18 Langer    
       FINCH      18-OCT-18 Langer    

9 Zeilen ausgewählt.

Wählen Sie Teach, Count ( ) Count aus test_std mit count ( )> 1 Gruppe nach TEACH.

LEHRZÄHLER


Langer 2 Testamente 4


0

Dies ist die SQL-Ausführungsreihenfolge einer Abfrage.

Geben Sie hier die Bildbeschreibung ein

Sie können die Ausführungsreihenfolge anhand von Beispielen aus diesem Artikel überprüfen .

Für Ihre Frage könnten die folgenden Zeilen hilfreich sein und direkt aus diesem Artikel stammen .

  1. GROUP BY -> Die verbleibenden Zeilen nach dem Anwenden der WHERE-Einschränkungen werden dann basierend auf gemeinsamen Werten in der in der GROUP BY-Klausel angegebenen Spalte gruppiert. Aufgrund der Gruppierung gibt es nur so viele Zeilen, wie eindeutige Werte in dieser Spalte enthalten sind. Dies bedeutet implizit, dass Sie dies nur verwenden müssen, wenn Ihre Abfrage Aggregatfunktionen enthält.
  1. HAVING -> Wenn die Abfrage eine GROUP BY-Klausel enthält, werden die Einschränkungen in der HAVING-Klausel auf die gruppierten Zeilen angewendet. Verwerfen Sie die gruppierten Zeilen, die die Einschränkung nicht erfüllen. Wie die WHERE-Klausel ist auch in den meisten Datenbanken über diesen Schritt nicht auf Aliase zugegriffen werden.

Verweise:-


-2

SELECT
FROM
Joins
WHERE
GROUP Durch
MIT
ORDER BY


13
Das ist eigentlich falsch. Laut MS Certified Trainers und offiziellem Schulungsmaterial ist Order By nach Select. Ein bisschen logisch, wenn man darüber nachdenkt. Es wäre dumm, einen virtuellen Tisch zu bestellen, den Sie noch nicht geholt und geklebt haben. :)
Simme
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.