Ich lese CJ Date's SQL und Relationale Theorie: Wie man genauen SQL Code schreibt , und er macht den Fall, dass Positionsabfragen schlecht sind - zum Beispiel dieses %code% :
%Vor%Stattdessen sollten Sie attributbasierte Abfragen wie folgt verwenden:
%Vor%Nun verstehe ich, dass die erste Abfrage nicht mit dem relationalen Modell übereinstimmt, da Tupel (Zeilen) ungeordnete Gruppen von Attributen (Spalten) sind. Ich habe Probleme zu verstehen, wo der Schaden in der ersten Abfrage ist. Kann mir das jemand erklären?
Sie sollten versuchen, Ihre SQL-Abfragen so wenig wie möglich vom genauen Layout der Tabelle abhängig zu machen.
Die erste Abfrage beruht darauf, dass die Tabelle nur drei Felder in genau dieser Reihenfolge enthält. Jede Änderung an der Tabelle wird die Abfrage unterbrechen.
Die zweite Abfrage beruht nur darauf, dass es diese drei Felder in der Tabelle gibt, und die Reihenfolge der Felder ist irrelevant. Sie können die Reihenfolge der Felder in der Tabelle ändern, ohne die Abfrage zu unterbrechen, und Sie können sogar Felder hinzufügen, solange sie Nullwerte zulassen oder einen Standardwert haben.
Obwohl Sie das Tabellenlayout nicht sehr oft neu anordnen, ist das Hinzufügen weiterer Felder zu einer Tabelle durchaus üblich.
Auch die zweite Abfrage ist besser lesbar. Sie können aus der Abfrage selbst erkennen, was die Werte in den Datensatz bedeuten.
Mir sind theoretische Konzepte in dieser Hinsicht nicht wirklich wichtig (wie in der Praxis hat eine Tabelle eine definierte Spaltenreihenfolge). Der Hauptgrund, warum ich die zweite der ersten bevorzugen würde, ist eine zusätzliche Abstraktionsebene . Sie können Spalten in einer Tabelle ändern, ohne Ihre Abfragen zu verwirren.
Die erste Abfrage bricht jedes Mal, wenn sich das Tabellenschema ändert. Die zweite Abfrage berücksichtigt jede Schemaänderung, die ihre Spalten intakt lässt und keine standardmäßigen Spalten hinzufügt.
Personen, die %code% Abfragen durchführen und sich dann auf die Positionsnotation verlassen, um die Werte zu extrahieren, um die sie besorgt sind, sind Softwarewartungs-Superschurken
SQL gibt Ihnen die Syntax zum Angeben des Spaltennamens für INSERT- und SELECT-Anweisungen. Sie sollten dies verwenden, weil:
Etwas, das noch nicht erwähnt wurde, ist, dass Sie oft einen Ersatzschlüssel als PK haben, mit %code% (oder etwas Ähnlichem), um einen Wert zuzuweisen. Bei der ersten Methode müssten Sie etwas angeben. Aber welchen Wert können Sie angeben, wenn er nicht verwendet werden soll? %code% könnte eine Option sein, aber das passt nicht wirklich, wenn man bedenkt, dass der PK auf %code% gesetzt wäre.
Aber abgesehen davon ist das Ganze "an ein bestimmtes Schema gebunden" ein viel wichtigerer Grund, IMO.
Ich bevorzuge die UPDATE-ähnliche Syntax:
%Vor%Das ist viel einfacher zu lesen und zu pflegen als beide Beispiele.
Ich werde eine weitere Sache hinzufügen, die zweite Abfrage ist weniger anfällig für Fehler, sogar bevor Tabellen geändert werden. Warum sage ich das? Aufgrund des Seocnd-Formulars können Sie (und sollten beim Schreiben der Abfrage) visuell prüfen, ob die Spalten in der Einfügetabelle und die Daten in der Klausel values oder select tatsächlich in der richtigen Reihenfolge liegen. Andernfalls könnte es passieren, dass Sie die Sozialversicherungsnummer aus Versehen in das Honorarfeld eingeben und den Sprechern ihre SSN zahlen anstatt den Betrag, den sie für eine Rede leisten sollten (Beispiel nicht willkürlich gewählt, außer dass wir es vorher eingefangen haben) Sichtprüfung!).
Langfristig, wenn Sie Ihrer Tabelle eine weitere Spalte hinzufügen, funktioniert Ihr INSERT nur, wenn Sie die Spaltenliste explizit angeben. Wenn jemand die Reihenfolge der Spalten ändert, kann Ihr INSERT im Hintergrund erfolgreich Werte in falsche Spalten einfügen.
Obwohl die Reihenfolge der Spalten im Schema definiert ist, sollte sie im Allgemeinen nicht als wichtig angesehen werden, da sie nicht konzeptionell wichtig ist.
Es bedeutet auch, dass jeder, der die erste Version liest, das Schema konsultieren muss, um herauszufinden, was die Werte bedeuten sollen. Zugegeben, das ist so, als würde man in den meisten Programmiersprachen Positionsargumente verwenden, aber irgendwie fühlt sich SQL in dieser Hinsicht etwas anders - ich würde die zweite Version sicherlich leichter verstehen (vorausgesetzt, die Spaltennamen sind vernünftig).