it-swarm.com.de

Wie vereinfache ich das Schreiben komplexer SQL-Abfragen?

Ich finde es sehr schwierig, komplexe SQL-Abfragen mit Verknüpfungen über viele (mindestens 3-4) Tabellen und mit mehreren verschachtelten Bedingungen zu schreiben. Die Abfragen, die ich schreiben soll, lassen sich leicht durch ein paar Sätze beschreiben, erfordern jedoch möglicherweise eine trügerische Menge an Code, um abgeschlossen zu werden. Ich benutze häufig temporäre Ansichten, um diese Abfragen zu schreiben, die wie eine Krücke wirken. Welche Tipps können Sie geben, mit denen ich diese komplexen Abfragen vereinfachen kann? Wie kann ich diese Abfragen in die Schritte unterteilen, die zum tatsächlichen Schreiben des SQL-Codes erforderlich sind?

Beachten Sie, dass ich das SQL bin, das ich schreiben soll, das Teil der Hausaufgaben für einen Datenbankkurs ist. Daher möchte ich keine Software, die die Arbeit für mich erledigt. Ich möchte den Code tatsächlich verstehen Ich schreibe.

Weitere technische Details:

  • Die Datenbank wird auf einem PostgreSQL-Server gehostet, der auf dem lokalen Computer ausgeführt wird.
  • Die Datenbank ist sehr klein: Es gibt nicht mehr als sieben Tabellen und die größte Tabelle hat weniger als etwa 50 Zeilen.
  • Die SQL-Abfragen werden unverändert über LibreOffice Base an den Server übergeben.
42
bwDraco

Ich stütze mich größtenteils darauf, nur die "richtige" Antwort zu finden, sodass Sie möglicherweise feststellen, dass es einige Leistungsprobleme gibt. Es macht keinen Sinn, eine falsche Abfrage zu beschleunigen.

Verstehe die Tabellenbeziehungen - Die meisten werden eins zu viele sein. Kennen Sie die "viele" Tabelle. Identifizieren Sie die Felder, die für Ihre Joins erforderlich sind.

Denken Sie an LINKS-Beitrittsszenarien - Wählen Sie alle Mitarbeiter und ihren Gehaltsscheck aus dem letzten Monat aus. Was ist, wenn sie letzten Monat keinen Gehaltsscheck bekommen haben?

Kennen Sie die Ergebnismenge : 1) Geben Sie in einer Tabelle manuell mindestens einen korrekten Datensatz für Ihre Abfrage ein. 2) Schreiben Sie die Abfrage in einer ausreichend einfachen Form, um festzustellen, wie viele Datensätze zurückgegeben werden sollen. Verwenden Sie beide, um Ihre Abfrage zu testen und sicherzustellen, dass das Verknüpfen einer neuen Tabelle das Ergebnis nicht verändert.

Teilen Sie Ihre Abfrage in überschaubare Teile auf - Sie müssen nicht alles auf einmal schreiben. Komplexe Abfragen können manchmal nur eine Sammlung einfacher Abfragen sein.

Vorsicht vor gemischten Aggregationsebenen: Wenn Sie monatliche, vierteljährliche und aktuelle Werte in dieselbe Ergebnismenge einfügen müssen, müssen Sie diese in Abfragen, die nach verschiedenen Werten gruppiert sind, separat berechnen.

Wissen, wann zu UNION Manchmal ist es einfacher, Untergruppen in ihre eigenen Select-Anweisungen aufzuteilen. Wenn Sie eine Tabelle mit Managern und anderen Mitarbeitern gemischt haben und in jeder Spalte Fallanweisungen basierend auf der Mitgliedschaft in einer dieser Gruppen ausführen müssen, ist es möglicherweise einfacher, eine Managerabfrage und eine Vereinigung in eine Mitarbeiterabfrage zu schreiben. Jeder würde seine eigene Logik enthalten. Es liegt auf der Hand, Elemente aus verschiedenen Tabellen in verschiedene Zeilen aufzunehmen.

Komplexe/verschachtelte Formeln - Versuchen Sie, konsistent einzurücken, und haben Sie keine Angst, mehrere Zeilen zu verwenden. "CASE WHEN CASE WHEN CASE WHEN" wird Sie verrückt machen. Nehmen Sie sich Zeit, um diese zu überdenken. Speichern Sie die komplexen Berechnungen zum Schluss. Holen Sie sich zuerst die richtigen Datensätze ausgewählt. Dann greifen Sie komplexe Formeln an und wissen, dass Sie mit den richtigen Werten arbeiten. Wenn Sie die in den Formeln verwendeten Werte anzeigen, können Sie Bereiche erkennen, in denen Sie NULL-Werte berücksichtigen müssen und in denen der Fehler zum Teilen durch Null behandelt werden soll.

Testen Sie häufig, während Sie neue Tabellen hinzufügen, um sicherzustellen, dass Sie immer noch die gewünschte Ergebnismenge erhalten und wissen, welcher Join oder welche Klausel der Schuldige ist.

49
JeffO
  1. Einrückung wäre das erste, was zu tun ist, wenn Sie es nicht bereits tun. Dies ist nicht nur bei einfachen Abfragen nützlich, sondern auch bei Verknüpfungen und Abfragen, die etwas komplexer sind als ein select top 1 [ColumnName] from [TableName].

  2. Einmal richtig eingerückt, verbietet nichts, Kommentare hinzufügen in der Abfrage selbst, falls zutreffend. Verwenden Sie sie nicht zu häufig: Wenn der Code explizit genug ist, beeinträchtigt das Hinzufügen von Kommentaren nur die Klarheit des Codes. Für die weniger expliziten Teile der Abfrage sind sie jedoch weiterhin willkommen.

    Beachten Sie, dass längere Abfragen (einschließlich Abfragen mit Kommentaren) eine größere Bandbreitennutzung zwischen Ihrem Anwendungsserver und Ihrem Datenbankserver bedeuten würden. Beachten Sie außerdem, dass die durch die Kommentare hinzugefügte Größe möglicherweise nichts an der Leistung ändert, es sei denn, Sie arbeiten an einem Produkt im Google-Maßstab mit einer großen Anzahl von Anforderungen pro Sekunde, die eine außergewöhnliche Leistung und Ressourcennutzung erfordern.

  3. Durchsetzen des gleichen Stils über Tabellen, Spalten usw. verbessert auch die Lesbarkeit erheblich. Wenn eine Legacy-Datenbank die Tabellen PRODUCT, users, USERS_ObsoleteDONT_USE, PR_SHIPMENTS Und HRhbYd_UU Enthält, macht jemand etwas sehr Falsches.

  4. Erzwingen des gleichen Stils über Abfragen ist ebenfalls wichtig. Wenn Sie beispielsweise Abfragen für Microsoft SQL Server schreiben und [TableName] Anstelle von TableName verwenden möchten, bleiben Sie dabei. Wenn Sie nach einem select zu einer neuen Zeile wechseln, tun Sie dies nicht nur in der Hälfte Ihrer Abfragen, sondern in allen.

  5. Verwenden Sie nicht *, es sei denn, es gibt starke Gründe dafür (wie in if exists(select * from [TableName] where ...) in Microsoft SQL Server). Nicht nur * Hat negative Auswirkungen auf die Leistung in einigen (wenn nicht den meisten) Datenbanken, sondern ist auch für den Entwickler, der Ihre Abfrage verwendet, nicht hilfreich. Auf die gleiche Weise muss ein Entwickler auf die Werte nach Namen und niemals nach Index zugreifen.

  6. Schließlich ist es für die Auswahl nichts Falsches, ein view bereitzustellen. Für alles andere kann gespeicherte Prozeduren auch verwendet werden, abhängig vom Projekt und den Personen¹, mit denen Sie arbeiten².


¹ Manche Menschen hassen gespeicherte Prozeduren. Andere mögen sie aus mehreren (zumindest für sie vollkommen) Gründen nicht.

² Ihre Kollegen, die anderen Schüler, Ihr Lehrer usw.

28

Ein bisschen im Dunkeln hier, aber wenn Sie viele temporäre Ansichten schreiben, haben Sie vielleicht noch nicht bemerkt, dass an den meisten Stellen, an denen Sie eine Tabelle in eine SQL-Anweisung einfügen könnten, diese Tabelle durch eine Abfrage ersetzt werden kann.

Anstatt Tabelle A mit der temporären Ansicht B zu verknüpfen, können Sie Tabelle A mit der Abfrage verknüpfen, die Sie als temporäre Ansicht B verwendet haben. Beispiel:

    SELECT A.Col1, A.Col2, B.Col1,B.Col2
      FROM (SELECT RealTableZ.Col1, RealTableY.Col2, RealTableY.ID as ID
              FROM RealTableZ 
   LEFT OUTER JOIN RealTableY
                ON RealTableZ.ForeignKeyY=RealTableY.ID
             WHERE RealTableY.Col11>14
            ) As B
        INNER JOIN A
                ON A.ForeignKeyY=B.ID

Dieses Beispiel ist ziemlich sinnlos, sollte aber die Syntax erklären.

Für Ansichten, die nicht "speziell" sind (indiziert, partitioniert), sollte dies zu demselben Abfrageplan führen, als ob Sie eine Ansicht verwendet hätten.

Um das Schreiben zu vereinfachen, können Sie jedes Stück überprüfen, um sicherzustellen, dass Sie das erhalten, was Sie erwarten, bevor Sie die gesamte Abfrage ausschreiben.

Ich entschuldige mich, wenn dies für Sie bereits ein alter Hut ist.

9
psr

Verwenden Sie anstelle von temporären Ansichten die WITH-Klausel . Dies macht es viel einfacher, große Abfragen in besser lesbare kleinere Teile zu zerlegen.

7
user281377
  1. Machen Sie sich mit der Mengenlehre vertraut, wenn Sie es noch nicht sind. SQL basiert auf der Mengenlehre. Wenn Sie mehr über Mengen wissen, können Sie sich besser mit der Funktionsweise von SQL vertraut machen.
  2. Übe mehr SQl. Wenn du nur SQL lernst, wird es einige Zeit dauern, um zu verstehen, wie man alles macht. Einige Dinge brauchen nur Zeit, bis du sie wirklich verstehst. Joins sind ein großartiges Beispiel. Je mehr du sie verwendest, desto besser wirst du darin.
  3. Stellen Sie sicher, dass die Tabellen, die Sie abfragen, ordnungsgemäß gestaltet sind
  4. Haben Sie keine Angst davor, Ansichten für ausgewählte Abfragen zu verwenden, insbesondere wenn Sie einen gemeinsamen Satz haben, der auf verschiedene Arten verfeinert werden muss
3
Ryathal

Wie alles andere möchten Sie das Problem in überschaubare Teile zerlegen.

Das ist übrigens wirklich IS, wie Sie komplexe Probleme lösen.

Also: Sie möchten die Unterabfrage überprüfen, um festzustellen, ob sie wirklich das zurückgibt, was Sie möchten, bevor Sie eine äußere Abfrage darauf ausführen. Sie möchten versuchen, jede Tabelle, an der Sie teilnehmen, minimal zu verknüpfen, damit Sie sehen können, dass Sie sie wirklich richtig durchdenken. Sachen wie diese. Die Hoffnung, alles einzutippen und genau das herauszuholen, was Sie wollen, ist einfach unrealistisch.

Eine SQL-Anweisung ist, sobald sie eine bestimmte Komplexität erreicht hat, im Grunde ein kleines Programm für sich. Es macht einen großen Unterschied, wirklich zu verstehen, wie die Daten kombiniert, ausgewählt, gefiltert und ausgegeben werden.

1
Dan Ray