SQL Grundlagen
Structured Query Language
Von SELECT bis JOIN - Alles was du für die Prüfung brauchst
Drücke Leertaste oder → für die nächste Folie
Was ist SQL?
SQL = Structured Query Language
Standardsprache für relationale Datenbanken
✅ Wozu?
- • Daten abfragen
- • Daten einfügen
- • Daten ändern
- • Daten löschen
📊 Beispiele
- • MySQL
- • PostgreSQL
- • Microsoft SQL Server
- • Oracle Database
Wie ist eine Datenbank aufgebaut?
Datenbank → enthält mehrere Tabellen
Tabelle → besteht aus Spalten (Felder) und Zeilen (Datensätze)
| KundenID |
Name |
Email |
Stadt |
| 1 |
Max Müller |
max@mail.de |
Berlin |
| 2 |
Anna Schmidt |
anna@mail.de |
Hamburg |
| 3 |
Tom Weber |
tom@mail.de |
München |
↑ Diese Tabelle heißt "Kunden" und hat 4 Spalten und 3 Zeilen
SELECT - Daten abfragen
Die wichtigste SQL-Anweisung überhaupt!
SELECT * FROM Kunden;
→ Zeigt alle Spalten aus der Tabelle "Kunden"
SELECT Name, Email FROM Kunden;
→ Zeigt nur die Spalten Name und Email
💡 Merke:
• * = alle Spalten
• Spaltennamen mit Komma trennen
• Jede Anweisung endet mit ;
WHERE - Daten filtern
Nur bestimmte Zeilen auswählen
SELECT * FROM Kunden
WHERE Stadt = 'Berlin';
→ Nur Kunden aus Berlin
SELECT * FROM Bestellungen
WHERE Betrag > 100;
→ Nur Bestellungen über 100 Euro
Vergleichsoperatoren:
= (gleich)
> (größer)
< (kleiner)
>= (größer gleich)
<= (kleiner gleich)
!= oder <> (ungleich)
⚠️ Wichtig:
Text in 'Anführungszeichen'
Zahlen ohne Anführungszeichen
Logische Operatoren: AND, OR, NOT
AND - Beide Bedingungen müssen erfüllt sein
SELECT * FROM Kunden
WHERE Stadt = 'Berlin' AND PLZ > 10000;
OR - Mindestens eine Bedingung muss erfüllt sein
SELECT * FROM Kunden
WHERE Stadt = 'Berlin' OR Stadt = 'Hamburg';
NOT - Negiert die Bedingung
SELECT * FROM Kunden
WHERE NOT Stadt = 'Berlin';
LIKE - Mustersuche mit Platzhaltern
SELECT * FROM Kunden
WHERE Name LIKE 'M%';
→ Namen die mit M beginnen (Max, Müller, Maria...)
SELECT * FROM Kunden
WHERE Email LIKE '%@gmail.com';
→ Alle Gmail-Adressen
SELECT * FROM Kunden
WHERE Name LIKE '%er%';
→ Namen die "er" enthalten (Weber, Müller, Werner...)
Platzhalter:
% = beliebig viele Zeichen (auch 0)
_ = genau ein Zeichen
IN und BETWEEN
IN - Wert in einer Liste
SELECT * FROM Kunden
WHERE Stadt IN ('Berlin', 'Hamburg', 'München');
→ Kürzer als: Stadt = 'Berlin' OR Stadt = 'Hamburg' OR...
BETWEEN - Wertebereich
SELECT * FROM Kunden
WHERE PLZ BETWEEN 10000 AND 20000;
→ PLZ von 10000 bis 20000 (inklusive Grenzen!)
💡 Tipp:
BETWEEN inkludiert die Grenzwerte (10000 und 20000 sind dabei)
ORDER BY - Sortierung
SELECT * FROM Kunden
ORDER BY Name;
→ Sortiert nach Name aufsteigend (A-Z)
SELECT * FROM Kunden
ORDER BY Name DESC;
→ Sortiert nach Name absteigend (Z-A)
SELECT * FROM Kunden
ORDER BY Stadt, Name;
→ Erst nach Stadt, dann nach Name sortieren
ASC (aufsteigend):
A → Z
0 → 9
Standard (muss nicht angegeben werden)
DESC (absteigend):
Z → A
9 → 0
Muss explizit angegeben werden
LIMIT und DISTINCT
LIMIT - Anzahl begrenzen
SELECT * FROM Kunden
LIMIT 5;
→ Nur die ersten 5 Datensätze
DISTINCT - Duplikate entfernen
SELECT DISTINCT Stadt
FROM Kunden;
→ Jede Stadt nur einmal (keine Duplikate)
Kombination
SELECT * FROM Kunden
ORDER BY Name
LIMIT 10;
→ Die ersten 10 Kunden, sortiert nach Name
⚠️ Wichtig:
LIMIT kommt immer ganz am Ende der SQL-Anweisung!
Aggregatfunktionen
Berechnungen über mehrere Zeilen hinweg
COUNT()
Zählt Zeilen
SELECT COUNT(*)
FROM Kunden;
SUM()
Addiert Werte
SELECT SUM(Betrag)
FROM Bestellungen;
AVG()
Durchschnitt
SELECT AVG(Betrag)
FROM Bestellungen;
MIN() / MAX()
Kleinster / Größter Wert
SELECT MAX(Betrag)
FROM Bestellungen;
💡 Merke:
Aggregatfunktionen fassen mehrere Zeilen zu einem Ergebnis zusammen!
COUNT, SUM, AVG - Beispiele
Wie viele Kunden gibt es?
SELECT COUNT(*) FROM Kunden;
Ergebnis: Eine Zahl, z.B. 150
Gesamtumsatz aller Bestellungen?
SELECT SUM(Betrag) FROM Bestellungen;
Ergebnis: z.B. 45230.50
Durchschnittlicher Bestellwert?
SELECT AVG(Betrag) FROM Bestellungen;
Ergebnis: z.B. 87.45
⚠️ Wichtig:
WHERE kommt VOR der Aggregatfunktion!
SELECT COUNT(*) FROM Bestellungen
WHERE Betrag > 100;
GROUP BY - Gruppierung
Aggregatfunktionen pro Gruppe berechnen
SELECT Stadt, COUNT(*)
FROM Kunden
GROUP BY Stadt;
→ Wie viele Kunden pro Stadt?
| Stadt |
COUNT(*) |
| Berlin |
45 |
| Hamburg |
32 |
| München |
28 |
⚠️ Goldene Regel:
Alle Spalten in SELECT (außer Aggregatfunktionen) müssen auch in GROUP BY stehen!
HAVING - Gruppen filtern
WHERE vs HAVING
WHERE
Filtert vor der Gruppierung
Einzelne Zeilen
HAVING
Filtert nach der Gruppierung
Gruppen/Aggregate
SELECT Stadt, COUNT(*)
FROM Kunden
GROUP BY Stadt
HAVING COUNT(*) > 5;
→ Nur Städte mit mehr als 5 Kunden zeigen
SELECT KundenID, SUM(Betrag)
FROM Bestellungen
GROUP BY KundenID
HAVING SUM(Betrag) > 500;
→ Nur Kunden mit Gesamtumsatz über 500€
SQL-Befehle: Richtige Reihenfolge!
1. SELECT - Welche Spalten?
2. FROM - Aus welcher Tabelle?
3. WHERE - Zeilen filtern (vor Gruppierung)
4. GROUP BY - Nach was gruppieren?
5. HAVING - Gruppen filtern (nach Gruppierung)
6. ORDER BY - Wie sortieren?
7. LIMIT - Wie viele Zeilen?
SELECT Stadt, COUNT(*)
FROM Kunden
WHERE PLZ > 10000
GROUP BY Stadt
HAVING COUNT(*) > 3
ORDER BY COUNT(*) DESC
LIMIT 5;
⚠️ Diese Reihenfolge ist Pflicht!
Falsche Reihenfolge = Fehler!
JOINs - Mehrere Tabellen verbinden
Warum JOINs?
Daten sind oft auf mehrere Tabellen verteilt:
Tabelle: Bestellungen
| BestellID | KundenID | Betrag |
| 101 | 1 | 50€ |
| 102 | 1 | 75€ |
| 103 | 2 | 30€ |
→ JOIN verbindet über KundenID
INNER JOIN
Nur Zeilen, die in BEIDEN Tabellen vorkommen
SELECT Kunden.Name, Bestellungen.Betrag
FROM Bestellungen
INNER JOIN Kunden
ON Bestellungen.KundenID = Kunden.KundenID;
Ergebnis:
| Name | Betrag |
| Max | 50€ |
| Max | 75€ |
| Anna | 30€ |
💡 INNER JOIN:
Zeigt nur Datensätze, die in BEIDEN Tabellen einen passenden Wert haben
Kunde ohne Bestellung? → Wird NICHT angezeigt
LEFT JOIN
ALLE Zeilen der linken Tabelle + passende der rechten
SELECT Kunden.Name, Bestellungen.Betrag
FROM Kunden
LEFT JOIN Bestellungen
ON Kunden.KundenID = Bestellungen.KundenID;
Ergebnis:
| Name | Betrag |
| Max | 50€ |
| Max | 75€ |
| Anna | 30€ |
| Tom | NULL |
Tom hat keine Bestellung → Betrag ist NULL
💡 LEFT JOIN:
Zeigt ALLE Kunden (linke Tabelle), auch die ohne Bestellung
Perfekt für: "Zeige auch Kunden ohne Bestellung"
JOIN-Syntax im Detail
SELECT Tabelle1.Spalte, Tabelle2.Spalte
FROM Tabelle1
INNER JOIN Tabelle2
ON Tabelle1.SchlüsselSpalte = Tabelle2.SchlüsselSpalte;
Wichtige Punkte:
- •
Tabelle.Spalte - Gib immer an, aus welcher Tabelle die Spalte kommt
- •
ON - Definiert, wie die Tabellen verbunden werden
- • Meist wird über ID-Spalten verbunden (z.B. KundenID)
SELECT k.Name, b.Betrag
FROM Kunden AS k
INNER JOIN Bestellungen AS b
ON k.KundenID = b.KundenID;
→ AS gibt Tabellen einen kürzeren Namen
Mehrere JOINs kombinieren
Drei oder mehr Tabellen verbinden
SELECT Kunden.Name, Produkte.Produktname, Bestellungen.Menge
FROM Bestellungen
INNER JOIN Kunden
ON Bestellungen.KundenID = Kunden.KundenID
INNER JOIN Produkte
ON Bestellungen.ProduktID = Produkte.ProduktID;
Ergebnis:
| Name | Produktname | Menge |
| Max | Laptop | 1 |
| Max | Maus | 2 |
| Anna | Tastatur | 1 |
💡 Mehrere JOINs:
Jeder JOIN verbindet zwei Tabellen
Einfach nacheinander schreiben!
Unterabfragen (Subqueries)
SELECT innerhalb von SELECT
SELECT * FROM Bestellungen
WHERE Betrag > (SELECT AVG(Betrag) FROM Bestellungen);
→ Alle Bestellungen über dem Durchschnitt
SELECT * FROM Kunden
WHERE KundenID IN (
SELECT KundenID FROM Bestellungen
);
→ Alle Kunden, die mindestens eine Bestellung haben
💡 Unterabfragen:
Die innere Abfrage wird zuerst ausgeführt
Das Ergebnis wird in der äußeren Abfrage verwendet
UNION - Ergebnisse kombinieren
Mehrere SELECT-Abfragen zu einem Ergebnis vereinen
SELECT Name FROM Kunden WHERE Stadt = 'Berlin'
UNION
SELECT Name FROM Kunden WHERE Stadt = 'Hamburg';
→ Alle Kunden aus Berlin und Hamburg (ohne Duplikate)
UNION
Entfernt Duplikate
SELECT ... UNION SELECT ...
UNION ALL
Behält Duplikate
SELECT ... UNION ALL SELECT ...
⚠️ Wichtig:
Beide SELECT-Abfragen müssen die GLEICHE ANZAHL Spalten haben!
Tipps für die Prüfung 🎯
✅ Do's:
- • SQL-Schlüsselwörter GROSS schreiben (SELECT, FROM, WHERE...)
- • Text immer in 'einfache Anführungszeichen'
- • Jede Anweisung mit Semikolon (;) beenden
- • Bei JOINs immer Tabelle.Spalte angeben
- • Reihenfolge beachten: SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT
❌ Don'ts:
- • Zahlen NICHT in Anführungszeichen
- • WHERE und HAVING nicht verwechseln
- • Bei GROUP BY alle Spalten (außer Aggregate) angeben
- • LIMIT nicht vor ORDER BY schreiben
Häufige Fehler vermeiden ⚠️
❌ FALSCH:
SELECT Name, COUNT(*)
FROM Kunden
GROUP BY Stadt;
Name ist in SELECT, aber nicht in GROUP BY!
✅ RICHTIG:
SELECT Stadt, COUNT(*)
FROM Kunden
GROUP BY Stadt;
❌ FALSCH:
SELECT * FROM Kunden
WHERE COUNT(*) > 5;
Aggregatfunktion in WHERE nicht erlaubt!
✅ RICHTIG:
SELECT Stadt, COUNT(*)
FROM Kunden
GROUP BY Stadt
HAVING COUNT(*) > 5;
Zusammenfassung 📚
Grundlagen
- ✓ SELECT, FROM
- ✓ WHERE
- ✓ AND, OR, NOT
- ✓ LIKE, IN, BETWEEN
Sortierung
- ✓ ORDER BY (ASC/DESC)
- ✓ LIMIT
- ✓ DISTINCT
Aggregation
- ✓ COUNT, SUM, AVG
- ✓ MIN, MAX
- ✓ GROUP BY
- ✓ HAVING
Erweitert
- ✓ INNER JOIN
- ✓ LEFT JOIN
- ✓ Unterabfragen
- ✓ UNION
Viel Erfolg! 🚀
Jetzt geht's zu den Übungen!