Was ist SQL eigentlich?
SQL heißt Structured Query Language — die Standard-Sprache, mit der man relationale Datenbanken befragt und verändert. PostgreSQL, MySQL, MariaDB, MS SQL Server, Oracle — die sprechen alle SQL, mit kleinen Dialekt-Unterschieden.
Stell dir eine Datenbank wie einen Aktenschrank vor: Tabellen sind die Schubladen, Spalten sind die Spalten in einem Formular, Zeilen sind einzelne ausgefüllte Formulare. SQL ist die Sprache, mit der du dem Aktenschrank sagst: "Hol mir alle Akten, in denen 'Wuppertal' steht" oder "Trag bei Akte 42 das Datum auf heute um".
Die vier Grund-Operationen — CRUD
CRUD merken
- Create — Neue Zeile anlegen →
INSERT - Read — Zeilen lesen →
SELECT - Update — Zeile ändern →
UPDATE - Delete — Zeile löschen →
DELETE
Beispiel-Tabelle
Damit die Beispiele konkret werden, arbeiten wir mit dieser Tabelle kunden:
| id | name | ort | umsatz |
|---|---|---|---|
| 1 | Müller GmbH | Wuppertal | 12500 |
| 2 | Schmidt AG | Köln | 8400 |
| 3 | Becker KG | Wuppertal | 21000 |
SELECT — Daten lesen
Der wichtigste Befehl. Pattern: SELECT spalten FROM tabelle WHERE bedingung.
-- Alle Kunden
SELECT * FROM kunden;
-- Nur Name und Ort der Kunden aus Wuppertal
SELECT name, ort FROM kunden WHERE ort = 'Wuppertal';
-- Kunden mit Umsatz über 10.000 Euro
SELECT name, umsatz FROM kunden WHERE umsatz > 10000;
-- Sortiert nach Umsatz absteigend, nur die Top 2
SELECT name, umsatz FROM kunden ORDER BY umsatz DESC LIMIT 2;Wichtige WHERE-Operatoren
=gleich,<>oder!=ungleich<,>,<=,>=GrößenvergleicheBETWEEN x AND y— Bereich (inklusive beider Grenzen)IN (a, b, c)— gehört zu ListeLIKE 'Wupper%'— beginnt mit "Wupper" (% = beliebige Zeichen)IS NULL/IS NOT NULL— leer / nicht leer
INSERT, UPDATE, DELETE — Daten ändern
-- Neuen Kunden anlegen
INSERT INTO kunden (name, ort, umsatz)
VALUES ('Weber GbR', 'Düsseldorf', 5000);
-- Umsatz von Kunde 2 ändern
UPDATE kunden SET umsatz = 9500 WHERE id = 2;
-- Kunde löschen
DELETE FROM kunden WHERE id = 4;Niemals UPDATE oder DELETE ohne WHERE!
UPDATE kunden SET umsatz = 0; setzt den Umsatz von allen Kunden auf 0. Genauso löscht DELETE FROM kunden; die ganze Tabelle leer. Klassische Karriere-Killer-Befehle. Immer erst SELECT mit der gleichen WHERE-Bedingung testen, bevor du UPDATE oder DELETE laufen lässt.
JOIN — Daten aus mehreren Tabellen
Wenn du eine zweite Tabelle bestellungen hast, willst du oft "Welcher Kunde hat was bestellt?" Dafür gibt es JOINs. Die wichtigsten zwei:
- INNER JOIN — gibt nur Zeilen, die in beiden Tabellen passen.
- LEFT JOIN — gibt alle Zeilen der linken Tabelle, auch wenn rechts nichts passt (NULL ergänzt).
-- Kunden + ihre Bestellungen (nur die mit Bestellungen)
SELECT k.name, b.produkt, b.menge
FROM kunden k
INNER JOIN bestellungen b ON b.kunden_id = k.id;
-- Alle Kunden — auch ohne Bestellung
SELECT k.name, b.produkt
FROM kunden k
LEFT JOIN bestellungen b ON b.kunden_id = k.id;JOINs visuell merken
- INNER = Schnittmenge — was in beiden Tabellen ist
- LEFT = Linke Tabelle komplett + Schnittmenge
- RIGHT = Rechte Tabelle komplett + Schnittmenge
- FULL OUTER = beide komplett, NULL wo nichts passt
Aggregation — GROUP BY und HAVING
Wenn du nicht einzelne Zeilen, sondern Summen, Mittelwerte oder Anzahlen willst:
-- Wie viele Kunden pro Ort?
SELECT ort, COUNT(*) AS anzahl
FROM kunden
GROUP BY ort;
-- Nur Orte mit Gesamt-Umsatz über 20.000
SELECT ort, SUM(umsatz) AS gesamt
FROM kunden
GROUP BY ort
HAVING SUM(umsatz) > 20000;WHERE vs. HAVING
WHERE filtert vor dem Gruppieren (einzelne Zeilen). HAVING filtert nach dem Gruppieren (Aggregat-Ergebnisse). Klassische Prüfungsfrage.
Was du dir mitnehmen solltest
- CRUD = Create/Read/Update/Delete = INSERT/SELECT/UPDATE/DELETE.
- SELECT-Pattern:
SELECT spalten FROM tabelle WHERE bedingung ORDER BY ... LIMIT .... - UPDATE und DELETE nie ohne WHERE — sonst trifft es alle Zeilen.
- JOIN verbindet Tabellen — INNER bei Schnittmenge, LEFT wenn die linke Seite vollständig sein muss.
- WHERE filtert vor dem GROUP BY, HAVING danach.
