Zeilen lesen: SELECT, WHERE, ORDER BY, LIMIT

Die meisten Abfragen bestehen aus SELECT, WHERE, ORDER BY und LIMIT. Diese Lektion erklärt die Aufgabe jeder Klausel und ihr Zusammenspiel.

Ihre erste Abfrage

Eine Abfrage beantwortet eine Frage: Welche Zeilen, und welche ihrer Spalten, will ich? Am kürzesten fragt man mit SELECT * – alle Spalten – und FROM mit einer Tabelle.

1

-- Every column of every product. Run it with F9 or Ctrl/Cmd + Enter.
SELECT *
FROM products
LIMIT 20;
In Planche ausführen

Ergebnis — erste 5 von 20 Zeilen

idcategory_idnamedescriptionskupricecoststock_quantityweight_kgattributesis_activecreated_atupdated_at
116Glass Orchard (Paperback ed.)Glass Orchard (Paperback ed.) — built to last.SKU-00001913.72443.951796.18{"color":"green","warranty_months":12,"material":"fabric"}12024-01-13 07:13:522024-01-13 07:13:52
217Luma The GeneLuma The Gene — built to last.SKU-00002332.64161.72835.893{"color":"silver","warranty_months":24,"material":"steel"}12022-06-16 08:45:202022-06-16 08:45:20
321Quill HelmetQuill Helmet — designed for daily use.SKU-00003196.26118.253998.261{"color":"silver","warranty_months":24}12022-08-26 20:06:032022-08-26 20:06:03
416Kite Glass Orchard 3Kite Glass Orchard 3 — built to last.SKU-000041719.68845.912435.263{"color":"silver","warranty_months":24}02022-07-19 11:34:272022-07-19 11:34:27
517The Gene (3rd ed.)The Gene (3rd ed.) — a dependable everyday choice.SKU-00005122.869.53571.898{"color":"red","warranty_months":36,"material":"aluminium"}12022-05-21 10:53:402022-05-21 10:53:40

Öffnet Planche in einem eigenen Browser-Tab, mit geladener Beispieldatenbank und dieser Abfrage im Editor. Alle Beispiele der Seite verwenden denselben Tab weiter, und ausgeführt wird erst, wenn Sie F9 drücken.

Das * bedeutet „alle Spalten“, LIMIT 20 „höchstens zwanzig Zeilen“. Wenn Sie nur die Struktur einer Tabelle prüfen möchten, müssen Sie nicht alle Tausenden Zeilen aus products laden. Diese Zeilen müssten sonst übertragen und dargestellt werden.

Planche begrenzt Ergebnismengen ebenfalls (Einstellungen › Sicherheit › Zeilenlimit). Ein LIMIT in der Abfrage macht aber auch die gewünschte Datenmenge für den Datenbankserver eindeutig.

Spalten auswählen

SELECT * ist zum Erkunden da. Sobald Sie wissen, was Sie suchen, nennen Sie die Spalten: Das Ergebnis wird schmaler, ist leichter zu lesen, und die Datenbank bewegt weniger Daten.

2

SELECT name, sku, price, stock_quantity
FROM products
LIMIT 20;
In Planche ausführen

Ergebnis — erste 5 von 20 Zeilen

nameskupricestock_quantity
Glass Orchard (Paperback ed.)SKU-00001913.72179
Luma The GeneSKU-00002332.6483
Quill HelmetSKU-00003196.26399
Kite Glass Orchard 3SKU-000041719.68243
The Gene (3rd ed.)SKU-00005122.8357

Die Reihenfolge, in der Sie sie aufzählen, ist die Reihenfolge, in der sie zurückkommen – die Spaltenreihenfolge der Tabelle spielt hier keine Rolle. Umbenennen können Sie mit AS, worauf wir am Ende dieser Lektion zurückkommen.

Zeilen mit WHERE filtern

SELECT wählt Spalten, WHERE wählt Zeilen. Es nimmt eine Bedingung und behält nur die Zeilen, für die sie wahr ist.

3

SELECT name, price, stock_quantity
FROM products
WHERE price > 100
LIMIT 20;
In Planche ausführen

Ergebnis — erste 5 von 20 Zeilen

namepricestock_quantity
Lean Startup (Deluxe ed.)107.3784
Pixel Sofa108.187
Terra Pillow Pro113.670
Pulse LED Strip114.86480
Brief Answers (3rd ed.)117.96194

Die Vergleichsoperatoren sind die erwartbaren: =, <> (oder !=), <, <=, >, >=. Zwei davon verhalten sich anders als in anderen Sprachen und erwischen jeden einmal:

  • Gleichheit ist ein einzelnes =, nicht ==.
  • Nichts ist gleich NULL, nicht einmal NULL selbst. WHERE weight_kg = NULL trifft überhaupt keine Zeile, egal wie viele Produkte kein Gewicht hinterlegt haben. Der Test, den Sie wollen, ist IS NULL / IS NOT NULL. Die nächste Lektion behandelt das ausführlich.

Sortieren mit ORDER BY

Ohne ORDER BY ist die Reihenfolge der zurückgegebenen Zeilen nicht definiert. Wenn Ihnen die Reihenfolge wichtig ist, schreiben Sie sie hin – und wenn nicht, verlassen Sie sich nicht auf das, was Sie zufällig sehen, denn es kann sich ändern, sobald sich ein Index oder die Daten ändern.

4

SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 20;
In Planche ausführen

Ergebnis — erste 5 von 20 Zeilen

nameprice
Glide GPS Watch Pro2484.4
Terra 3D Puzzle2481.77
Aria Castle Kit2479.41
Aria LED Strip Pro2463.41
Nova Brief Answers2445.49

DESC sortiert absteigend, ASC (die Vorgabe) aufsteigend. Beachten Sie die Kombination in dieser Abfrage: ORDER BY price DESC mit LIMIT 20 ist die Art, nach den Top 20 zu fragen. Tauschen Sie die beiden Klauseln im Kopf, und Sie sehen, warum die Reihenfolge zählt – die Datenbank sortiert erst alles und nimmt dann die ersten zwanzig.

In Planche tippen Sie das selten. Ein Klick auf eine Spaltenüberschrift im Ergebnisraster sortiert die ganze Tabelle serverseitig und wechselt zwischen aufsteigend → absteigend → unsortiert. Das erzeugte SQL anzusehen ist eine gute Kontrolle für das eigene.

Nach mehr als einer Spalte sortieren

Nennen Sie mehrere Schlüssel, und jeder löst die Gleichstände auf, die der vorherige übrig lässt.

5

SELECT category_id, name, price
FROM products
ORDER BY category_id, price DESC
LIMIT 30;
In Planche ausführen

Ergebnis — erste 5 von 30 Zeilen

category_idnameprice
2Aria Notebook2116.4
2Ember Laptop Plus2087.98
2Sol Notebook1982.34
2Sol Ultrabook1942.47
2Nimbus Ultrabook1933.06

Das gruppiert Produkte nach Kategorie und stellt innerhalb jeder Kategorie das teuerste nach vorn. Es liest sich als "nach Kategorie, dann nach Preis absteigend" – genau der Satz, den Sie laut sagen würden.

Ausdrücke und Aliase

In der SELECT-Liste müssen keine Spalten stehen. Dort darf Arithmetik stehen, ein Funktionsaufruf oder alles andere, was je Zeile einen Wert liefert – und AS gibt dem Ergebnis einen Namen.

6

SELECT name,
       price,
       cost,
       ROUND(price - cost, 2) AS margin
FROM products
WHERE is_active = 1
ORDER BY margin DESC
LIMIT 15;
In Planche ausführen

Ergebnis — erste 5 von 15 Zeilen

namepricecostmargin
Ember Tab Plus2412.93984.941427.99
Aria LED Strip Pro2463.411098.691364.72
Luma Denim Jacket Pro2357.59993.241364.35
Drift A Winter Letter2422.51082.431340.07
Nova Brief Answers2445.491108.091337.4

ROUND(price - cost, 2) AS margin berechnet eine Spalte, die es in der Tabelle nirgends gibt, und der Name margin ist danach in ORDER BY verwendbar. In WHERE ist er es nicht, worüber regelmäßig gestolpert wird. Der Grund ist die Reihenfolge, in der die Datenbank die Klauseln auswertet:

FROM  ->  WHERE  ->  SELECT  ->  ORDER BY  ->  LIMIT

Wenn ORDER BY an der Reihe ist, hat SELECT margin längst erzeugt. Wenn WHERE läuft, noch nicht, deshalb ist WHERE margin > 50 ein Fehler – Sie müssen den Ausdruck wiederholen oder die Abfrage in eine weitere einpacken. Behalten Sie diese Reihenfolge im Kopf; sie erklärt auch, warum WHERE vor dem Gruppieren filtert und HAVING danach, was die übernächste Lektion ist.

Was Sie jetzt können

Mit diesen Klauseln allein lassen sich erstaunlich viele echte Fragen beantworten: die zwanzig teuersten Produkte, alles Ausverkaufte, die größten Margen im aktiven Katalog. Was noch nicht geht, ist eine Frage über zwei Tabellen hinweg – welcher Kunde welche Bestellung aufgegeben hat – und dafür sind Joins da.

Bevor Sie weitergehen: Ändern Sie in den Beispielen oben Zahlen und Spaltennamen und führen Sie sie erneut aus. Das Raster aktualisiert sich an Ort und Stelle, die Schleife ist also schnell.

Selbst ausprobieren

  1. Die zehn günstigsten Produkte, die noch im Verkauf sind, nur mit Name und Preis. (is_active ist 1, wenn ein Produkt verkauft wird.)

    Lösung anzeigen

    Lösung anzeigen

    SELECT name, price
    FROM products
    WHERE is_active = 1
    ORDER BY price
    LIMIT 10;
    In Planche ausführen

    Ergebnis — erste 5 von 10 Zeilen

    nameprice
    Clean Code (2nd ed.)6.89
    Nimbus Desk Max7.21
    Drift Castle Kit Max17.35
    Pixel Laptop18.46
    Terra Dumbbell Set19.8

    Drei Klauseln mit je einer Aufgabe: WHERE wirft aus dem Verkauf genommene Produkte weg, ORDER BY price stellt die günstigsten nach vorn – aufsteigend ist die Vorgabe, ein Schlüsselwort braucht es nicht – und LIMIT 10 hört dort auf.

  2. Wie hoch ist der Lagerwert je Produkt? Zeigen Sie Name, Menge und Preis × Menge auf zwei Nachkommastellen gerundet, das Größte zuerst.

    Lösung anzeigen

    Lösung anzeigen

    SELECT name,
           stock_quantity,
           ROUND(price * stock_quantity, 2) AS stock_value
    FROM products
    ORDER BY stock_value DESC
    LIMIT 10;
    In Planche ausführen

    Ergebnis — erste 5 von 10 Zeilen

    namestock_quantitystock_value
    Luma Boots4921042454.52
    Glide GPS Watch Pro4141028541.6
    Brief Answers (Deluxe ed.)434988448.02
    Brief Answers (Hardcover ed.)413980879.13
    Vega Field Watch464975221.28

    Die dritte Spalte gibt es in der Tabelle nirgends; AS stock_value benennt sie, und weil ORDER BY nach SELECT läuft, lässt sich dieser Name zum Sortieren verwenden.