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.