Essentiell📊 42% Prüfungs-Häufigkeit🎯 ~155 Punkte kumuliert
SELECT-Abfragen
Daten lesen: WHERE, JOINs, Aggregation, Sortierung, Unterabfragen. Nach Pseudocode der zweitgrößte Punktbringer.
Warum Priorität „Essentiell"? Kommt praktisch in jeder Prüfung vor (100%). Hier nichts offen lassen.
Lernziele
- SELECT-Abfragen mit WHERE, JOIN, GROUP BY, HAVING und ORDER BY schreiben
- Aggregatfunktionen korrekt anwenden und WHERE vs. HAVING unterscheiden
- Unterabfragen (korreliert / unkorreliert) lesen und schreiben
1. Grundgerüst
sql
SELECT spalten / ausdrücke
FROM tabelle1
JOIN tabelle2 ON …
WHERE bedingung
GROUP BY ausdruck
HAVING aggregat-bedingung
ORDER BY ausdruck [ASC|DESC]
LIMIT n;2. Filter mit WHERE
sql
SELECT name, stadt
FROM kunde
WHERE stadt IN ('Berlin', 'Hamburg')
AND name LIKE 'M%';Operatoren: = <> < >=, BETWEEN a AND b, IN (…), LIKE 'Muster%', IS NULL.
3. JOINs
| Join | Effekt |
|---|---|
INNER JOIN | nur Zeilen mit Treffer auf beiden Seiten |
LEFT JOIN | alle Zeilen der linken Tabelle, rechte ggf. NULL |
RIGHT JOIN | spiegelbildlich |
FULL OUTER JOIN | alle Zeilen beider Seiten, unpassende mit NULL |
CROSS JOIN | kartesisches Produkt |
sql
-- Alle Bestellungen mit Kundenname und Summe je Bestellung
SELECT b.id, k.name, SUM(bp.menge * a.preis) AS summe
FROM bestellung b
JOIN kunde k ON k.id = b.kunde_id
JOIN bestellposition bp ON bp.bestellung_id = b.id
JOIN artikel a ON a.id = bp.artikel_id
GROUP BY b.id, k.name
ORDER BY summe DESC;4. Aggregation
| Funktion | Zweck |
|---|---|
COUNT(*) | alle Zeilen |
COUNT(spalte) | Zeilen mit nicht-NULL-Wert |
SUM / AVG | Summe / Durchschnitt (ignorieren NULL) |
MIN / MAX | kleinster / größter Wert |
5. WHERE vs. HAVING
sql
-- Kunden mit mindestens 3 Bestellungen in Berlin
SELECT k.name, COUNT(*) AS anzahl
FROM kunde k
JOIN bestellung b ON b.kunde_id = k.id
WHERE k.stadt = 'Berlin' -- filtert Zeilen
GROUP BY k.name
HAVING COUNT(*) >= 3; -- filtert Gruppen6. Unterabfragen
sql
-- Alle Artikel, die teurer sind als der Durchschnitt
SELECT bezeichnung, preis
FROM artikel
WHERE preis > (SELECT AVG(preis) FROM artikel);sql
-- Kunden, die noch nie bestellt haben
SELECT name
FROM kunde k
WHERE NOT EXISTS (
SELECT 1 FROM bestellung b WHERE b.kunde_id = k.id
);Übungen
SQL-ÜbungLiefere Name und Stadt aller Kunden aus Hamburg, alphabetisch nach Name sortiert.
Tabellen-Schema ansehen
-- Beispielschema für die Übungen kunde (id, name, stadt) artikel (id, bezeichnung, preis) bestellung (id, kunde_id, datum) bestellposition (id, bestellung_id, artikel_id, menge)
💡 WHERE für die Stadt, ORDER BY für die Sortierung.
SQL-ÜbungLiefere pro Kunde die Anzahl seiner Bestellungen (Spalten: name, anzahl). Kunden ohne Bestellung bitte mit 0 anzeigen.
Tabellen-Schema ansehen
-- Beispielschema für die Übungen kunde (id, name, stadt) artikel (id, bezeichnung, preis) bestellung (id, kunde_id, datum) bestellposition (id, bestellung_id, artikel_id, menge)
💡 Damit Kunden ohne Bestellung trotzdem auftauchen: LEFT JOIN.
SQL-ÜbungFinde alle Artikel, die teurer sind als der durchschnittliche Artikelpreis.
Tabellen-Schema ansehen
-- Beispielschema für die Übungen kunde (id, name, stadt) artikel (id, bezeichnung, preis) bestellung (id, kunde_id, datum) bestellposition (id, bestellung_id, artikel_id, menge)
💡 Unterabfrage mit AVG() in der WHERE-Klausel.