Kurse › Datengetriebene Entscheidungen: Von der Frage zur Antwort
Ihre erste echte Abfrage auf Alpenkorb-Bestellungen
Lektion 5 von 8 · 13 Min.
Die Form jeder Abfrage
Sie haben in den ersten vier Labs kleine Abfragen ausgeführt. Diese Lektion bringt die Teile in eine Ordnung, denn fast jede Analyseabfrage hat dasselbe Grundgerüst.
SELECT columns or calculations FROM table WHERE conditions on rows ORDER BY sort columns LIMIT number of rows;
SQL führt die Klauseln in einer anderen Reihenfolge aus, als Sie sie schreiben. Zuerst wählt FROM die Tabelle, dann entfernt WHERE Zeilen, dann berechnet SELECT die Spalten, dann sortiert ORDER BY und LIMIT schneidet ab. Deshalb kann WHERE nicht nach einem Namen filtern, den Sie in SELECT erzeugen, während ORDER BY danach sortieren kann.
Filter, die zum Geschäft passen
Lena will wissen, ob Rabattcodes grössere Warenkörbe kaufen. In der Tabelle orders enthält discount_code Codes wie WELCOME10 für eine erste Bestellung oder AFFILIATE15 von Partnerseiten, und ist leer, wenn kein Code verwendet wurde. In SQL ist ein leerer Wert NULL, was unbekannt bedeutet, und braucht einen eigenen Test.
SELECT order_id, order_date, source, discount_code, net_amount FROM orders WHERE status = 'delivered' AND discount_code IS NOT NULL AND order_date >= '2026-01-01' ORDER BY net_amount DESC LIMIT 3;
discount_code = NULL würde überhaupt keine Zeilen zurückgeben. Der Vergleich von irgendetwas mit unbekannt ergibt unbekannt, und WHERE behält nur Zeilen, bei denen die Bedingung wahr ist. Verwenden Sie stattdessen IS NULL und IS NOT NULL.
ANDverlangt jede Bedingung,ORmindestens eine. Wenn Sie beides mischen, setzen Sie Klammern:WHERE status = 'delivered' AND (region = 'Bern' OR region = 'Basel').INist eine Kurzform für mehrereOR:region IN ('Bern', 'Basel').- Textvergleiche brauchen einfache Anführungszeichen und die exakte Schreibweise. Die Regionen sind geschrieben als
'Zurich','Geneva'und'St. Gallen'.
Drei kleine Fehler verursachen die meisten gescheiterten ersten Abfragen. Textwerte nutzen einfache Anführungszeichen: In DuckDB bedeutet "delivered" in doppelten Anführungszeichen eine Spalte namens delivered, und die Abfrage schlägt fehl. Daten werden als Text im ISO-Format geschrieben, '2026-01-01', was DuckDB korrekt mit einer Datumsspalte vergleicht. Und ein fehlendes oder überzähliges Komma zwischen Spalten erzeugt einen Syntaxfehler beim nächsten Wort.
Die Status-Falle
Die Tabelle orders enthält jede jemals aufgegebene Bestellung, einschliesslich 67 stornierter und 80 retournierter. Ihr net_amount ist trotzdem ausgefüllt, weil der Betrag bekannt war, als die Bestellung aufgegeben wurde. Vergessen Sie status = 'delivered', ist der Umsatz zu hoch. Im ersten Quartal 2026 macht dieser Fehler aus CHF 37'107.20 CHF 38'787.67. Der Fehler ist auch nicht gleichmässig verteilt: Stornierungen und Retouren sind bei manchen Quellen häufiger als bei anderen.
Was zeigte die Rabattfrage? Im ersten Quartal 2026 nutzten 90 der 648 gelieferten Bestellungen einen Code. Ihr Durchschnittswert lag bei CHF 57.16, gegenüber CHF 57.28 bei Bestellungen ohne Code. Nach dieser Evidenz kaufen Codes keine grösseren Warenkörbe. Sie gewinnen vielleicht trotzdem Neukundinnen, was eine andere Frage ist und eine andere Abfrage braucht. Bevor Sie einem Ergebnis vertrauen, vergleichen Sie seine Zeilenzahl mit einer Zahl, die Sie bereits kennen: Das Lab in Lektion 2 lieferte 648 gelieferte Bestellungen für dieses Quartal, ein Filter auf dasselbe Quartal kann also nie mehr zurückgeben.
SELECT * FROM orders LIMIT 10, fügen Sie einen Filter hinzu, führen Sie sie aus, prüfen Sie die Zeilenzahl, dann fügen Sie den nächsten hinzu. Eine lange, in einem Zug geschriebene und einmal ausgeführte Abfrage verbirgt ihre Fehler.WHERE discount_code = NULL keine Zeilen?Melden Sie sich an, um zu antworten und Ihren Fortschritt zu verfolgen.
Anmelden