Heim  >  Artikel  >  Datenbank  >  Kennen Sie die logische Ausführungsreihenfolge von Select-Anweisungen?

Kennen Sie die logische Ausführungsreihenfolge von Select-Anweisungen?

伊谢尔伦
伊谢尔伦Original
2016-11-24 11:21:21971Durchsuche

Einführung

Dies ist kein tiefgreifendes technisches Problem, sondern eine großartige Programmierfähigkeit. Dies hängt nicht unbedingt direkt mit den Entwicklungsfähigkeiten einer Person zusammen, aber diese zu kennen, wird Ihnen beim Schreiben, bei der Fehlerbehebung und bei der Optimierung von SQL eine große Hilfe sein. Es handelt sich nicht um einen komplizierten Wissenspunkt, sondern um eine sehr grundlegende SQL-Grundlage. Wenn Sie diese Dinge nicht verstehen, bauen Sie Häuser aus gewöhnlichem Zement. Wenn Sie diese Dinge verstehen, bauen Sie Häuser aus hochwertigem Zement.

Es ist jedoch ein so kleiner Wissenspunkt. Sie können Ihre Kollegen und Freunde um Sie herum untersuchen. Vielleicht erleben Sie eine „Überraschung“.

Da dieser Artikel plötzlich geschrieben wurde, wurde die unten geschriebene SQL-Anweisung nicht getestet.

Sehen Sie sich die folgenden SQL-Anweisungen an:

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
HAVING TOTAL>2
SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY TOTAL
SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT
 
FROM STUDENT
 
GROUP BY NAME

Welche davon kann Ihrer Meinung nach nicht erfolgreich ausgeführt werden?

Näher dran

Das Folgende ist die logische Ausführungssequenz der SELECT-Anweisung:

FROM

ON

JOIN

WHERE

GROUP BY

MIT CUBE oder MIT ROLLUP

HAVING

SELECT

DISTINCT

ORDER BY

TOP

MICROSOFT wies darauf hin, dass die tatsächliche physische Ausführungsreihenfolge der SELECT-Anweisung aufgrund unterschiedlicher Abfrageprozessoren von dieser Reihenfolge abweichen kann.

Mehrere Beispiele

Beispiel 1

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
HAVING TOTAL>2

Kommt Ihnen diese SQL-Anweisung bekannt vor? Ja, sehr einfache Gruppenabfrage. Es kann jedoch nicht erfolgreich ausgeführt werden, da die Ausführungsreihenfolge von HAVING über SELECT liegt.

Die tatsächliche Ausführungssequenz ist wie folgt:

VOM STUDENT

GRUPPE NACH ID

GESAMT>2

SELECT ID, COUNT(ID ) AS TOTAL

Offensichtlich ist TOTAL ein neuer Alias, der generiert wird, nachdem der letzte Satz von SELECT ID, COUNT(ID) AS TOTAL ausgeführt wird. Daher kann TOTAL nicht erkannt werden, wenn HAVING TOTAL>2 ausgeführt wird.

Beispiel 2

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY TOTAL

Die tatsächliche Ausführungssequenz hierfür ist:

VOM STUDENT

GRUPPE NACH ID

SELECT ID , COUNT(ID) AS TOTAL

ORDER BY TOTAL

Dieses Mal gibt es kein Problem und es kann erfolgreich ausgeführt werden. Was passiert, wenn ORDER BY TOTAL durch ORDER BY COUNT(ID) ersetzt wird?

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY COUNT(ID)

Tatsächliche Ausführungssequenz:

VOM STUDENT

GRUPPE NACH ID

SELECT ID,COUNT(ID) AS TOTAL

ORDER BY COUNT(ID)

Ja, es kann erfolgreich ausgeführt werden. Betrachtet man den SQL-Ausführungsplan, ist es derselbe wie der obige ORDER BY TOTAL. ORDER BY wird nach SELECT ausgeführt, daher kann der Alias ​​TOTAL verwendet werden.

 Beispiel 3

SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT
 
FROM STUDENT
 
GROUP BY NAME

Tatsächliche Ausführungssequenz:

FROM STUDENT
 
GROUP BY NAME
 
SELECT FIRSTNAME+' '+LASTNAME AS NAME,COUNT(*) AS COUNT

Offensichtlich wurde der Alias ​​NAME nicht erstellt, wenn GROUP BY NAME vorhanden ist Daher kann es nicht erfolgreich ausgeführt werden.

Zusammenfassung

Wenn ich mich daran erinnere, dass ich einmal zufällig einigen Leuten diese Frage gestellt habe, egal wer sagte, sie wüssten es nicht, wir haben natürlich absichtlich darüber gelacht, der Spott einer Person war das nicht der Spott anderer. Aber es stellt sich heraus, dass es immer noch einige Leute gibt, denen dieser Wissenspunkt nicht auffällt. Ich poste ihn hier nur als freundliche Erinnerung.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn