Logische Abfrageverarbeitung in SQL Server

Um die Grundlagen von SQL Server zu erlernen, müssen Sie wissen, wie eine SQL Server-Abfrage-Engine eine SQL-Abfrage ausführt. T-SQL umfasst sowohl die logische als auch die physische Abfrageverarbeitung. Bei der physischen Abfrageverarbeitung geht es darum, wie eine Datenbank-Engine eine Abfrage verarbeitet. Logische Abfrageverarbeitung ist ein konzeptueller Ablauf, eine Reihenfolge der Klauseln, die wissen, wie SQL Server diese Klauseln beim Ausführen einer Abfrage auswertet.

Die meisten Programmiersprachen folgen dem Prinzip der zeilenweisen Verarbeitung eines Programms, aber der SQL-Server hat eine definierte logische Abfrageverarbeitungsreihenfolge, um Abfragen auszuführen.

Die Reihenfolge der logischen Verarbeitung wurde in zwei verschiedene Zweige aufgeteilt, je nachdem, ob UNION enthalten ist oder nicht.

Logische Abfrageausführung in SQL Server ohne UNION-Klausel

1. FROM, JOIN, APPLY und ON: Join-Bedingungen werden ausgewertet und der Abfragefilter ON wird angewendet.

2. WOHER: Dies ist ein weiterer Abfragefilter, der zum Abrufen von Datensätzen angewendet wird, die dem WHERE-Bedingungenfilter entsprechen.

3. GROUP BY- und Aggregatfunktionen: Gruppierungs- und Aggregationsoperationen durchgeführt

4. HABEN: Dies ist der dritte Filter, der auf ein aus der Gruppe erhaltenes Gesamtergebnis angewendet wird, um die Gruppen herauszufiltern

5. WÄHLEN: Liste der Spalten, die vom Abfrageergebnis zurückgegeben werden sollen

6. DISTINCT: Um doppelte Datensätze zu entfernen

7. SORTIEREN NACH: Sortieren des Ergebnisses aufsteigend / absteigend

8. OBEN: Der TOP-Filter wird angewendet, um die definierte X-Zeilenanzahl auszuwählen

9. FÜR XML: Um Abfrageergebnisse im XML-Format zurückzugeben

Logische Abfrageausführung in SQL Server mit einer UNION-Klausel

1. FROM, JOIN, APPLY und ON: Join-Bedingungen werden ausgewertet und der Abfragefilter ON wird angewendet.

2. WOHER: Ein weiterer Abfragefilter wurde zum Abrufen von Datensätzen angewendet, die dem WHERE-Bedingungenfilter entsprechen

3. GROUP BY- und Aggregatfunktionen: Gruppierungs- und Aggregationsoperationen durchgeführt

4. HABEN: Der dritte Filter, der auf ein Gesamtergebnis angewendet wird, das von der Gruppe erhalten wurde, um die Gruppen herauszufiltern

5. OBEN: Der TOP-Filter wird angewendet, um die definierte X-Zeilenanzahl auszuwählen.

6. SELECT und UNION: Um zwei Abfrageergebnissätze zu kombinieren und mithilfe der SELECT-Anweisung zurückzugeben

7. DISTINCT: Um doppelte Datensätze zu entfernen

8. SORTIEREN NACH: Sortieren des Ergebnisses aufsteigend / absteigend

9. FÜR XML: Um Abfrageergebnisse im XML-Format zurückzugeben

Beispiele zur Demonstration der Reihenfolge für die Verarbeitung logischer Abfragen

WENN OBJECT_ID ('Employee') NICHT NULL DROP TABLE-Mitarbeiter ist; CREATE TABLE Mitarbeiter (Id INT NOT NULL IDENTITÄT (1,1) PRIMARY KEY, Vorname VARCHAR (50) NOT NULL, MiddleName VARCHAR (50) NOT NULL, Nachname VARCHAR (50) NOT NULL, ContactNo VARCHAR (10) NOT NULL, Gehalt INT NULL); Einfügen in Mitarbeiterwerte ('Vishwanath', 'D', 'D', '9999955555', 12000); Einfügen in Employee-Werte ('Niraj', 'Y', 'Y', '9911223344', 14000); Einfügen in Mitarbeiterwerte ('Chetan', 'V', 'G', '989898989', 700000); Einfügen in Mitarbeiterwerte ('Atul', 'K', 'K', '9876780987', 40000); Einfügen in Employee-Werte ('Vishal', 'M', 'P', '7777711111', 12000); 

1. WHERE-Klausel Vor SELECT ausgewertet

Häufig machen Entwickler, die die logische Abfrageverarbeitung nicht verstehen, diesen Fehler: Sie versuchen, einen Spaltenaliasnamen zu verwenden, der in einer SELECT-Klausel in einer WHERE-Klausel definiert ist. Dies ist nicht zulässig, da eine SELECT-Klausel nach einer WHERE-Klausel ausgewertet wird, sodass der Spaltenalias der WHERE-Klausel nicht bekannt ist. Es wird der Fehler "Ungültiger Spaltenname" angezeigt.

Um dieses Problem zu lösen, können Sie das abgeleitete Tabellenkonzept oder (Gehalt * 12) in der where-Klausel verwenden (was in Bezug auf die Leistungsoptimierung eigentlich keine gute Praxis ist).

SELECT ID, (Gehalt * 12) als YearlySalary FROM Mitarbeiter WHERE YearlySalary> 10000; 

Meldung 207, Ebene 16, Status 1, Zeile 3
Ungültiger Spaltenname 'YearlySalary'.

2.Hieran-Klausel vor HAVING bewertet

Der wichtigste Unterschied zwischen der WHERE- und der HAVING-Klausel ist, dass die WHERE-Klausel vor der HAVING-Klausel ausgewertet wird. Die WHERE-Klausel wird auf Zeilen und die HAVING-Klausel auf Gruppen angewendet, die mit der GROUP BY-Klausel erstellt wurden.

Versuchen wir, Abteilungen aus der Employee-Tabelle zu finden, deren Gehaltssumme größer als 300000 ist. Die folgende Abfrage liefert ein Ergebnis, erfüllt jedoch nicht die Abfrageanforderung. Wir haben in der WHERE-Klausel einen Filter hinzugefügt, der Mitarbeiter mit einem Gehalt von mehr als 300000 filtert, nicht Abteilungen.

Dies sind falsche Versuche, Abteilungen herauszufiltern, deren Gehaltssumme mehr als 300000 beträgt.

SELECT DeptId, SUM (Gehalt) als SumOfSalary FROM Mitarbeiter WHERE Gehalt> 300000 GROUP BY DeptId; 
DeptId SumOfSalary 2 700000 

Richtige Abfrage mit Herausfiltern mit der HAVING-Klausel.

SELECT DeptId, SUM (Gehalt) als SumOfSalary FROM Employee GROUP BY DeptId HAVING SUM (Gehalt)> 300000; 
DeptId SumOfSalary 2 752000 

3. Ändern des Spaltenalias in einer SELECT-Klausel

Spaltenaliasnamen sind für einen anderen Ausdruck in derselben SELECT-Klausel nicht sichtbar. Es wird der Fehler "Ungültiger Spaltenname YearlySalary" ausgegeben, da versucht wird, auf den Alias ​​zu verweisen, der in derselben Auswahlliste erstellt wurde. Der Grund, dass T-SQL ist, wertet alle Ausdrücke aus, die in derselben logischen Abfrageverarbeitungsphase auf einmal angezeigt werden.

SELECT (Gehalt * 12) als Jährlich, Jährlich / 100 vom Angestellten; 

Meldung 207, Ebene 16, Status 1, Zeile 13
Ungültiger Spaltenname 'YearlySalary'.

4. Ändern des Spaltenalias in der ORDER BY-Klausel

Wenn wir einen Spaltenalias in einer SELECT-Klausel erstellen und versuchen, das Ergebnis anhand des erstellten Spaltenaliasnamens zu sortieren, ist dies zulässig, da bei einer logischen Abfrageverarbeitung eine SELECT-Klausel vor einer ORDER BY-Klausel ausgewertet wird.

SELECT (Gehalt * 12) als YearlySalary FROM Employee ORDER BY YearlySalary DESC; 
JährlichSalary 8400000 480000 168000 144000 144000 

Lesen Sie mehr über Datenbank- und SQL-Programmierung von Tech-Recipes.