**Dies ist eine alte Version des Dokuments!**
Inhaltsverzeichnis
SQL-Spickzettel
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.
Grundstruktur
Die Standard-Struktur einer SQL-Abfrage folgt immer derselben Reihenfolge:
- snippet.sql
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ĂĽsselbefehle im Ăśberblick
| 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 |
Beispiel 1 – Einfache Abfrage
Aufgabe:
Namen und Preise aller Produkte mit Lagerbestand > 100, nach Preis absteigend sortiert, max. 10 Einträge.
- snippet.sql
SELECT name, preis FROM produkte WHERE lagerbestand > 100 ORDER BY preis DESC LIMIT 10;
Erklärung:
WHEREfiltert nur Zeilen mit Lagerbestand ĂĽber 100.ORDER BY preis DESCsortiert die Ausgabe absteigend.LIMIT 10zeigt nur die ersten 10 Ergebnisse an.
Beispiel 2 – Gruppierte Auswertung
Aufgabe:
Pro Kategorie den Durchschnittspreis fĂĽr Produkte mit Lagerbestand > 100 berechnen.Nur Kategorien mit einem Durchschnittspreis > 50 anzeigen, absteigend sortiert, max. 10 Ergebnisse.
- snippet.sql
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 kategoriefasst Produkte derselben Kategorie zusammen.HAVINGfiltert nur Gruppen mit Durchschnitt > 50.- Das Alias
durchschnittspreiskann inORDER BYwiederverwendet werden.
Unterschied: WHERE vs. HAVING
| 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.“
Wichtige Aggregatfunktionen
| 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.
Sortierung
- snippet.sql
ORDER BY spalte [ASC|DESC]
| Parameter | Bedeutung |
|---|---|
| ASC | Aufsteigend (Standard) |
| DESC | Absteigend |
Beispiel:
- snippet.sql
ORDER BY preis DESC, name ASC;
→ Sortiert zuerst nach Preis (absteigend), dann nach Name (aufsteigend).
LIMIT & OFFSET
| Befehl | Bedeutung |
|---|---|
| ———- | ———————————— |
LIMIT n | Zeigt nur n Zeilen an |
OFFSET n | Ăśberspringt n Zeilen vor der Ausgabe |
Beispiel:
- snippet.sql
SELECT * FROM produkte ORDER BY preis DESC LIMIT 10 OFFSET 20;
→ Zeigt die Zeilen 21–30 der Sortierung.
Aliasnamen
Mit AS kannst du Spalten- oder Tabellennamen umbenennen:
- snippet.sql
SELECT name AS produktname, preis AS einzelpreis FROM produkte AS p;
Aliases erleichtern lesbare Ergebnisse und sind in ORDER BY wiederverwendbar.
Joins (Ăśberblick)
| 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.“
NĂĽtzliche PrĂĽfungsbefehle
- snippet.sql
-- 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';
Mini-Merksätze
- „SELECT zeigt, FROM liefert, WHERE filtert.“
- „GROUP BY fasst, HAVING prüft, ORDER BY sortiert.“
- „COUNT zählt, AVG mittelt, SUM addiert.“
- „Ohne WHERE = alles.“
- „Immer mit Semikolon abschließen.“
PrĂĽfungstipp
SQL in Ruhe logisch lesen:
- FROM – welche Tabelle(n)?
- WHERE – welche Bedingungen?
- GROUP BY – wie gruppieren?
- HAVING – was bleibt übrig?
- ORDER BY – wie sortieren?
- LIMIT – wie viele Zeilen?