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;
Ergebnis — erste 5 von 20 Zeilen
| id | category_id | name | description | sku | price | cost | stock_quantity | weight_kg | attributes | is_active | created_at | updated_at |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 16 | Glass Orchard (Paperback ed.) | Glass Orchard (Paperback ed.) — built to last. | SKU-00001 | 913.72 | 443.95 | 179 | 6.18 | {"color":"green","warranty_months":12,"material":"fabric"} | 1 | 2024-01-13 07:13:52 | 2024-01-13 07:13:52 |
| 2 | 17 | Luma The Gene | Luma The Gene — built to last. | SKU-00002 | 332.64 | 161.72 | 83 | 5.893 | {"color":"silver","warranty_months":24,"material":"steel"} | 1 | 2022-06-16 08:45:20 | 2022-06-16 08:45:20 |
| 3 | 21 | Quill Helmet | Quill Helmet — designed for daily use. | SKU-00003 | 196.26 | 118.25 | 399 | 8.261 | {"color":"silver","warranty_months":24} | 1 | 2022-08-26 20:06:03 | 2022-08-26 20:06:03 |
| 4 | 16 | Kite Glass Orchard 3 | Kite Glass Orchard 3 — built to last. | SKU-00004 | 1719.68 | 845.91 | 243 | 5.263 | {"color":"silver","warranty_months":24} | 0 | 2022-07-19 11:34:27 | 2022-07-19 11:34:27 |
| 5 | 17 | The Gene (3rd ed.) | The Gene (3rd ed.) — a dependable everyday choice. | SKU-00005 | 122.8 | 69.5 | 357 | 1.898 | {"color":"red","warranty_months":36,"material":"aluminium"} | 1 | 2022-05-21 10:53:40 | 2022-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;
Ergebnis — erste 5 von 20 Zeilen
| name | sku | price | stock_quantity |
|---|---|---|---|
| Glass Orchard (Paperback ed.) | SKU-00001 | 913.72 | 179 |
| Luma The Gene | SKU-00002 | 332.64 | 83 |
| Quill Helmet | SKU-00003 | 196.26 | 399 |
| Kite Glass Orchard 3 | SKU-00004 | 1719.68 | 243 |
| The Gene (3rd ed.) | SKU-00005 | 122.8 | 357 |
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;
Ergebnis — erste 5 von 20 Zeilen
| name | price | stock_quantity |
|---|---|---|
| Lean Startup (Deluxe ed.) | 107.37 | 84 |
| Pixel Sofa | 108.18 | 7 |
| Terra Pillow Pro | 113.67 | 0 |
| Pulse LED Strip | 114.86 | 480 |
| Brief Answers (3rd ed.) | 117.96 | 194 |
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 = NULLtrifft überhaupt keine Zeile, egal wie viele Produkte kein Gewicht hinterlegt haben. Der Test, den Sie wollen, istIS 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;
Ergebnis — erste 5 von 20 Zeilen
| name | price |
|---|---|
| Glide GPS Watch Pro | 2484.4 |
| Terra 3D Puzzle | 2481.77 |
| Aria Castle Kit | 2479.41 |
| Aria LED Strip Pro | 2463.41 |
| Nova Brief Answers | 2445.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;
Ergebnis — erste 5 von 30 Zeilen
| category_id | name | price |
|---|---|---|
| 2 | Aria Notebook | 2116.4 |
| 2 | Ember Laptop Plus | 2087.98 |
| 2 | Sol Notebook | 1982.34 |
| 2 | Sol Ultrabook | 1942.47 |
| 2 | Nimbus Ultrabook | 1933.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;
Ergebnis — erste 5 von 15 Zeilen
| name | price | cost | margin |
|---|---|---|---|
| Ember Tab Plus | 2412.93 | 984.94 | 1427.99 |
| Aria LED Strip Pro | 2463.41 | 1098.69 | 1364.72 |
| Luma Denim Jacket Pro | 2357.59 | 993.24 | 1364.35 |
| Drift A Winter Letter | 2422.5 | 1082.43 | 1340.07 |
| Nova Brief Answers | 2445.49 | 1108.09 | 1337.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.