In fast jedem formal strukturierten Satz von Informationen fangen Sie an, entweder von Anfang an gegen Ende zu lesen, oder gelegentlich vom Ende zum Anfang (zum Beispiel Straßenadressen). Aber in SQL, insbesondere SELECT-Abfragen, in der richtigen Reihenfolge Um seine Bedeutung richtig zu verstehen, müssen Sie in der FROM-Klausel beginnen. Dies kann lange Abfragen sehr schwer lesbar machen, insbesondere wenn es geschachtelte SELECT-Abfragen enthält.
Wenn etwas in der Programmierung keinen Sinn ergibt, liegt ein historischer Grund dahinter. Beginnen mit dem SELECT statt dem FROM macht keinen Sinn. Weiß jemand den Grund dafür?
Der SQL Wikipedia-Eintrag beschreibt kurz einen Verlauf:
In den 1970er Jahren entwickelte eine Gruppe des IBM San Jose Forschungslabors das relationale Datenbanksystem System R, das auf dem von Edgar F. Codd in seiner einflussreichen Arbeit "Ein relationales Datenmodell für große gemeinsame Datenbanken" vorgestellten Modell basiert ". Donald D. Chamberlin und Raymond F. Boyce von IBM erstellten daraufhin die Structured English Query Language (SEQUEL) , um die in System R gespeicherten Daten zu bearbeiten und zu verwalten. Das Akronym SEQUEL wurde später in SQL geändert, weil "SEQUEL" war eine Marke der britischen Hawker Siddeley Flugzeugfirma.
Der ursprüngliche Name explizit erwähnt Englisch , die Syntax zu erklären.
Etwas tiefer graben wir die FLOW-MATIC Programmiersprache.
FLOW-MATIC, ursprünglich bekannt als B-0 (Business Language Version 0), ist möglicherweise die erste englischsprachige Datenverarbeitungssprache . Sie wurde von Grace Hopper erfunden und spezifiziert, und die Entwicklung der kommerziellen Variante begann 1955 bei Remington Rand für die UNIVAC I. 1958 waren der Compiler und seine Dokumentation allgemein verfügbar und wurden kommerziell genutzt.
FLOW-MATIC war die Inspiration hinter der Common Business Oriented Language , einer der ältesten Programmiersprachen noch im aktiven Gebrauch. In Übereinstimmung mit diesem Geist wurde SEQUEL mit englischer Syntax entworfen (die 1970er Jahre sind modern, verglichen mit den 1950ern und 1960ern).
In der Perspektive greifen "moderne" Programmiersysteme immer noch auf Datenbanken zurück, die die uralten Ideen dahinter verwenden
%Vor%Ich muss widersprechen. SQL-Grammatik ist nicht von innen nach außen.
Aus dem ersten Blick können Sie erkennen, ob die Abfrage die Daten SELECT, INSERT, UPDATE oder DELETE enthält (der gesamte Rest von SQL, z. B. DDL, wird absichtlich weggelassen).
Zurück zu Ihrer SELECT-Anweisung Verwirrung: Das Ziel von SQL ist, deklarativ zu sein. Was bedeutet, dass Sie ausdrücken, was Sie wollen und nicht wie Sie es wollen. Es macht also Sinn, zuerst anzugeben, WAS SIE WOLLEN (Liste der Attribute, die Sie auswählen ing) und dann dem DBMS zusätzliche Informationen zur Verfügung stellen Info darüber, wo das von FROM nachgeschlagen werden soll.
Die Platzierung der WHERE-Klausel am Ende macht auch Sinn: Stellen Sie sich einen Trichter vor, oben breit, unten schmal. Wenn Sie am Ende der Anweisung eine WHERE-Klausel hinzufügen, ersticken Sie die Menge der resultierenden Daten. Würden Sie Ihre Abfrage an einem anderen Ort als unten einschränken, müsste der Entwickler den Kopf herumdrehen.
ORDER BY-Klausel ganz am Ende: Sobald die Daten den Trichter durchlaufen haben, sortieren Sie sie.
JOINS (JOIN-Kriterien) gehören wirklich in die FROM-Klausel.
GROUPING: Im Grunde laufen Daten durch einen Trichter, bevor es in einen anderen Trichter kommt.
SQL-Syntax ist süß. Da ist nichts aus sich heraus. Vielleicht ist SQL deshalb auch nach so vielen Jahrzehnten so beliebt. Es ist ziemlich einfach zu begreifen und Sinn zu machen. (Obwohl ich schon einmal eine 7-seitige (A4-Größe) SQL-Anweisung vorfand, die mich eine ganze Weile brauchte, um mich umzudrehen.)
Es ist so gestaltet, dass es Englisch ist. Ich denke, das ist der Hauptgrund.
Als Randnotiz erinnere ich mich daran, dass die anfänglichen Previews von LINQ direkt danach modelliert wurden ( select ... from ...
). Dies wurde in späteren Previews geändert, um mehr Programmiersprache zu sein (so dass der Scope nach unten geht). Anders Hejlsberg hat diese seltsame Tatsache über SQL (die IntelliSense härter macht und nicht den C # -Regeln entspricht) als Grund dafür genannt, dass sie diese Entscheidung getroffen haben.
Wie auch immer, gut oder schlecht, es ist was es ist und es ist zu spät, etwas zu ändern.
Die Reihenfolge der Klauseln in SQL ist absolut logisch. Denken Sie daran, dass SQL eine deklarative Sprache ist, in der Sie angeben, was Sie wollen, und das System ermittelt, wie Sie es am besten erhalten. Die erste Klausel ist die Select-Klausel, in der Sie die gewünschten Spalten in der Ergebnistabelle aufführen. Dies ist der Hauptzweck der Abfrage. Nachdem Sie angegeben haben, wie das Ergebnis aussehen soll, geben Sie als nächstes an, wo die Daten herkommen sollen. Die where-Klausel begrenzt die Menge der zurückgegebenen Daten. Es hat keinen Sinn darüber nachzudenken, wie Sie Ihre Daten einschränken können, wenn Sie nicht wissen, woher sie kommen, also nach der from-Klausel. Die group by-Klausel arbeitet mit den Aggregationsoperatoren in der select-Klausel und könnte nach der from-Klausel an beliebiger Stelle stehen, aber es ist besser, über die Aggregation der gefilterten Daten nachzudenken, also kommt sie nach der where-Klausel. Die having-Klausel muss nach der group by-Klausel stehen. Die order by-Klausel behandelt die Art und Weise, wie die Daten dargestellt werden, und könnte nach dem Auswählen irgendwo hinführen.
Es stimmt mit der übrigen SQL-Syntax überein, dass jede Anweisung mit einem Verb beginnt ( CREATE
, DROP
, UPDATE
, usw.).
Der Hauptnachteil der ersten Spaltenliste ist, dass sie für die automatische Vervollständigung unbequem ist (wie Hejlsberg erwähnt hat), aber das war kein Problem, als die Syntax in den 1970ern entworfen wurde.
Wir hätten das Beste aus beiden Welten mit einer Syntax wie SELECT FROM SomeTable: ColumnA, ColumnB
haben können, aber es ist zu spät, um es jetzt zu ändern.
Trotzdem ist die SELECT
-Anweisung von SQL nicht eindeutig. Es entspricht genau dem von Python-Listen-Comprehensions:
[(rec.a, rec.b) for rec in data where rec.a > 0]
Geschichte der Sprache beiseite (obwohl es faszinierend ist) Ich denke, die Sache, die Sie vermissen, ist, dass SQL nicht darum geht, dem System zu sagen, was zu tun ist, so sehr wie das Endergebnis Sie wollen (und es herauszufinden, wie mach es)
zu sagen: "Geh da drüben zu diesem Regal, nimm die Hüte mit Hutband, blaue Hüte zuerst, dann grün, dann rot, und bring sie mir" sagt sehr viel das System wie zu Tun Sie, was Sie wollen. Es ist Programmierer, denken Sie , wo wir annehmen, dass der Arbeiter sehr dumm ist und detaillierte Anweisungen benötigt.
SQL beginnt mit dem Endergebnis zuerst, den gewünschten Daten, der Reihenfolge der Spalten usw. Es ist sehr viel die Perspektive von jemandem, der einen Bericht erstellt. "Ich will Vorname, Nachname, dann Alter, dann ....." Das ist nach all dem Zweck, die Anfrage zu stellen. Es beginnt also mit dem Format der gewünschten Ergebnisse. Dann geht es dahin, wo Sie erwarten, dass es die Daten findet, nach welchen Kriterien es zu suchen ist, nach der Reihenfolge, in der es präsentiert wird, usw.
Als Alternative zur detaillierten Festlegung, was der Mitarbeiter tun soll, setzt SQL voraus, dass das System weiß, wie das geht, und konzentriert sich mehr auf das, was Sie wollen.
Anstatt also pedantisch deinem Arbeiter zu sagen, er soll hierher kommen, hol dir das, bring es da drüben ... es ist eher wie "Ich will Hüte von Rack 12, die Hutbänder haben, und bitte sortiere sie nach Farbe."