Datenbanken ohne Rätselraten

Die erste nützliche Abfrage

21 min
What you'll learn
  • Abfragen mit einer expliziten Spaltenliste nach SELECT und einem Zeilenfilter über WHERE schreiben
  • eine Geschäftsfrage in SQL übersetzen, entlang dieser Route: Entität → FROM, Einschränkungen → WHERE (mit AND), Ausgabe → SELECT, Reihenfolge → ORDER BY
  • erklären, warum SELECT * in produktiven Abfragen schlechte Praxis ist
  • eine Abfrage prüfen, indem du sie laut nacherzählst: Wenn die Nacherzählung zur ursprünglichen Frage passt, ist die Abfrage inhaltlich richtig

Die Karte ist studiert — und QUERY ändert die Regeln. Bisher hast du das Archiv als Ganzes betrachtet, wie ein Besucher. Ein Archivar arbeitet anders. Auf dem Holopanel erlischt alles bis auf eine Tabelle, und eine Aufgabe erscheint: Stelle deine Frage so, dass in der Antwort keine einzige überflüssige Zeile und keine einzige überflüssige Spalte landet.

Wir wählen die nötigen Spalten und Zeilen

Für ein erstes Kennenlernen ist es praktisch, alles mit * zu holen. In der echten Arbeit ist das aber, als würde man das ganze Lager zur Kasse bringen. Meist brauchst du bestimmte Felder: Zähle sie nach SELECT durch Kommata getrennt auf.

Mit den Zeilen ist es genauso: Statt des ganzen Schaufensters wählst du über WHERE nur das nötige Segment. Bitten wir «Kotomarket» zum Beispiel nur um die Produkte aus der Kategorie Bücher:

Ein Kadett verengt mit einem bernsteinfarbenen Filter-Strahl ein holografisches Schaufenster; durch den Strahl gelangen nur wenige Kapsel-Zeilen mit Büchern
Eine präzise Frage an das Archiv: SELECT benennt die nötigen Spalten, WHERE lässt nur die passenden Zeilen durch.

Choosing the columns and rows you need

Grabbing everything with * is convenient for a first look, but in real work it’s like hauling the entire warehouse up to the checkout. Usually you need specific fields: list them, comma-separated, after SELECT.

It’s the same with rows: instead of the whole storefront, pick only the segment you need via WHERE. For example, let’s ask Kotomarket for only the products in the Books category:

Welche Bücher es im Schaufenster gibt und was sie kosten:
Query result
nameprice
SQL для профи1290.00
Чистый код1490.00
Алгоритмы на практике1690.00

Von der Geschäftsfrage zur Abfrage

Echte Fragen erreichen den Archivar nicht in SQL: „Welche Bücher sind billiger als fünfzehnhundert?“, „Was aus der Elektronik kostet mehr als 5000?“. Die Übersetzung folgt immer derselben Route:

  1. Entität → Tabelle. Worum geht es in der Frage: um Produkte, Käufer, Bestellungen? „Bücher billiger als 1500“ handelt von Produkten, also FROM products.
  2. Einschränkungen → WHERE. Jede Bedingung aus der Frage wird zu einer eigenen Filterbedingung: Kategorie „Bücher“, Preis kleiner als 1500.
  3. Was anzeigen → SELECT. Was soll der Mensch in der Antwort sehen? Name und Preis — die zählen wir auf, der Rest ist Lärm.
  4. Form der Antwort → ORDER BY. „Von günstig zu teuer“ bedeutet Sortierung nach Preis.
-- „Które książki są tańsze niż 1500 i ile kosztują, od tanich do drogich?”
SELECT name, price
FROM products
WHERE category = 'Книги' AND price < 1500
ORDER BY price;

Mehrere Bedingungen werden mit dem Wort AND verbunden — die Filteroperatoren behandeln wir im nächsten Kapitel ausführlich.

Und hier die Gegenprobe eines guten Archivars: Lies die fertige Abfrage laut wie einen Satz. „Aus den Produkten die Bücher unter 1500 nehmen, Name und Preis anzeigen, nach Preis sortieren“ — wenn diese Nacherzählung zur ursprünglichen Frage passt, ist die Abfrage inhaltlich richtig. Tauchen in der Nacherzählung „alle Spalten“ oder „das ganze Schaufenster“ auf, geh zurück und grenze sie enger ein.

Interview question

Frage aus dem Vorstellungsgespräch: Warum gilt SELECT * in produktiven Abfragen als schlechte Praxis?

Starke Antwort: Erstens wegen überflüssiger Daten: Netzwerk und Speicher werden für Spalten verbraucht, die niemand braucht, und die Datenbank verliert unter Umständen die Möglichkeit, allein aus dem Index zu antworten (index-only scan; Indizes — Kapitel 10). Zweitens wegen Brüchigkeit: Wenn Spalten hinzukommen oder umbenannt werden, können Berichte und Code brechen, die von Zusammensetzung und Reihenfolge der Spalten ausgehen. Eine explizite Spaltenliste ist der Vertrag der Abfrage; SELECT * ist höchstens beim interaktiven Erkunden von Daten sinnvoll.

Check yourself
Was zeigt die Abfrage SELECT name FROM products WHERE category = 'Книги'?

The index has been read: you know what’s in the five tables and which threads stitch them together. QUERY dims the map, and the next clearance level lights up on the holopanel — the reading terminal.

QUERY: Remember the cardinal property of this place: the archive answers only well-formed questions. From the next clearance on, we learn to ask precisely.

Practice: solve the tasks
Solved 0 of 2