Dieser Spickzettel fasst die wichtigsten SQL-Grundbefehle und deren Reihenfolge zusammen. Er eignet sich ideal zur Prüfungsvorbereitung (AP1 / AP2) und als tägliche Referenz.
Die Standard-Struktur einer SQL-Abfrage folgt immer derselben Reihenfolge:
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT ...;
Merke: Wenn du die Struktur immer vollständig aufschreibst, kannst du danach Schritt für Schritt alles ergänzen und Unnötiges streichen.
| SchlĂĽsselwort | Bedeutung | Beispiel |
|---|---|---|
| SELECT | Welche Spalten angezeigt werden | SELECT name, preis |
| FROM | Aus welcher Tabelle die Daten kommen | FROM produkte |
| WHERE | Filtert Zeilen vor der Gruppierung | WHERE lagerbestand > 100 |
| GROUP BY | Gruppiert gleiche Werte | GROUP BY kategorie |
| HAVING | Filtert nach der Gruppierung | HAVING AVG(preis) > 50 |
| ORDER BY | Sortiert die Ausgabe | ORDER BY preis DESC |
| LIMIT | Begrenzt die Zeilenanzahl | LIMIT 10 |
Aufgabe:
Namen und Preise aller Produkte mit Lagerbestand > 100, nach Preis absteigend sortiert, max. 10 Einträge.
SELECT name, preis FROM produkte WHERE lagerbestand > 100 ORDER BY preis DESC LIMIT 10;
Erklärung:
WHERE filtert nur Zeilen mit Lagerbestand ĂĽber 100.ORDER BY preis DESC sortiert die Ausgabe absteigend.LIMIT 10 zeigt nur die ersten 10 Ergebnisse an.Aufgabe:
Pro Kategorie den Durchschnittspreis fĂĽr Produkte mit Lagerbestand > 100 berechnen.Nur Kategorien mit einem Durchschnittspreis > 50 anzeigen, absteigend sortiert, max. 10 Ergebnisse.
SELECT kategorie, AVG(preis) AS durchschnittspreis FROM produkte WHERE lagerbestand > 100 GROUP BY kategorie HAVING AVG(preis) > 50 ORDER BY durchschnittspreis DESC LIMIT 10;
Erklärung:
AVG(preis) berechnet den Durchschnittspreis je Kategorie.GROUP BY kategorie fasst Produkte derselben Kategorie zusammen.HAVING filtert nur Gruppen mit Durchschnitt > 50.durchschnittspreis kann in ORDER BY wiederverwendet werden.| Vergleichspunkt | WHERE | HAVING |
|---|---|---|
| Zeitpunkt | Vor der Gruppierung | Nach der Gruppierung |
| Filtert | Einzelne Datensätze | Gruppenergebnisse |
| Beispiel | WHERE preis > 50 | HAVING AVG(preis) > 50 |
Merksatz:
„WHERE prüft Datensätze, HAVING prüft Gruppen.“
| Funktion | Beschreibung | Beispiel |
|---|---|---|
| COUNT() | Zählt Datensätze | COUNT(*) |
| SUM() | Summiert Werte | SUM(preis) |
| AVG() | Durchschnitt | AVG(preis) |
| MIN() | Kleinster Wert | MIN(preis) |
| MAX() | Größter Wert | MAX(preis) |
Hinweis:
Aggregatfunktionen kannst du nur in Verbindung mit GROUP BY oder zur Gesamtauswertung nutzen.
ORDER BY spalte [ASC|DESC]
| Parameter | Bedeutung |
|---|---|
| ASC | Aufsteigend (Standard) |
| DESC | Absteigend |
Beispiel:
ORDER BY preis DESC, name ASC;
→ Sortiert zuerst nach Preis (absteigend), dann nach Name (aufsteigend).
| Befehl | Bedeutung |
|---|---|
| ———- | ———————————— |
LIMIT n | Zeigt nur n Zeilen an |
OFFSET n | Ăśberspringt n Zeilen vor der Ausgabe |
Beispiel:
SELECT * FROM produkte ORDER BY preis DESC LIMIT 10 OFFSET 20;
→ Zeigt die Zeilen 21–30 der Sortierung.
Mit AS kannst du Spalten- oder Tabellennamen umbenennen:
SELECT name AS produktname, preis AS einzelpreis FROM produkte AS p;
Aliases erleichtern lesbare Ergebnisse und sind in ORDER BY wiederverwendbar.
| Join-Typ | Beschreibung | Beispiel |
|---|---|---|
| ————– | ————————————————- | ————————————————————————————- |
| INNER JOIN | Nur passende Datensätze beider Tabellen | SELECT * FROM kunden INNER JOIN bestellungen ON kunden.id = bestellungen.kunden_id; |
| LEFT JOIN | Alle Datensätze links + passende rechts | SELECT * FROM kunden LEFT JOIN bestellungen ON kunden.id = bestellungen.kunden_id; |
| RIGHT JOIN | Alle Datensätze rechts + passende links | SELECT * FROM kunden RIGHT JOIN bestellungen ON kunden.id = bestellungen.kunden_id; |
| FULL JOIN | Alle Datensätze beider Seiten (falls unterstützt) | SELECT * FROM kunden FULL JOIN bestellungen ON ...; |
Merksatz:
„INNER = nur Treffer, LEFT = alles links + Treffer, RIGHT = alles rechts + Treffer.“
-- Zeilen zählen SELECT COUNT(*) FROM produkte; -- Alle Kategorien ohne Wiederholung SELECT DISTINCT kategorie FROM produkte; -- Höchster Preis pro Kategorie SELECT kategorie, MAX(preis) FROM produkte GROUP BY kategorie; -- Preisaktualisierung UPDATE produkte SET preis = preis * 1.1 WHERE kategorie = 'Hardware'; -- Neue Zeile einfügen INSERT INTO produkte (name, preis, lagerbestand) VALUES ('Monitor', 199, 50); -- Datensatz löschen DELETE FROM produkte WHERE name = 'Altgerät';
SQL in Ruhe logisch lesen: