SQL-Befehle: Spickzettel mit Beispielen
SQL-Befehle mit Beispielen: SELECT, WHERE, JOIN, GROUP BY, INSERT, UPDATE, DELETE, Tabellen, Indizes und Transaktionen. Mit Hinweisen zu MySQL, PostgreSQL und SQLite, durchsuchbar und kopierbar.
58 Einträge
Daten abfragen
SELECT * FROM kunden;Alle Spalten und Zeilen einer TabelleSELECT name, ort FROM kunden WHERE ort = 'Berlin';Bestimmte Spalten mit BedingungSELECT DISTINCT ort FROM kunden;Jeden Wert nur einmalSELECT * FROM kunden ORDER BY name ASC, id DESC;Sortieren, aufsteigend und absteigendSELECT * FROM kunden ORDER BY id LIMIT 10 OFFSET 20;Zeilen 21 bis 30 (MySQL, PostgreSQL, SQLite)SELECT * FROM kunden ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;Dasselbe in Standard-SQL (SQL Server, Oracle, PostgreSQL)SELECT * FROM artikel WHERE preis BETWEEN 10 AND 20;Bereich, Grenzen eingeschlossenSELECT * FROM kunden WHERE name LIKE 'M%';Muster: % beliebig viele Zeichen, _ genau einesSELECT * FROM kunden WHERE ort IN ('Berlin', 'Hamburg');Wert aus einer ListeSELECT * FROM kunden WHERE email IS NULL;Fehlende Werte; = NULL funktioniert nichtSELECT name AS kunde FROM kunden k;Alias für Spalte und TabelleSELECT COALESCE(telefon, '-') FROM kunden;Ersten Wert nehmen, der nicht NULL istSELECT name, CASE WHEN umsatz > 1000 THEN 'A' ELSE 'B' END AS klasse FROM kunden;Bedingte WerteGruppieren und zählen
SELECT COUNT(*) FROM kunden;Zeilen zählenSELECT COUNT(DISTINCT ort) FROM kunden;Verschiedene Werte zählenSELECT SUM(betrag), AVG(betrag), MIN(betrag), MAX(betrag) FROM bestellungen;Summe, Durchschnitt, Minimum, MaximumSELECT ort, COUNT(*) FROM kunden GROUP BY ort;Je Gruppe zählenSELECT ort, COUNT(*) AS n FROM kunden GROUP BY ort HAVING COUNT(*) > 5;Gruppen filtern; WHERE filtert Zeilen vor dem Gruppieren, HAVING danachSELECT kunde_id, SUM(betrag) FROM bestellungen GROUP BY kunde_id ORDER BY 2 DESC;Nach der Summe sortierenTabellen verbinden (JOIN)
SELECT * FROM bestellungen b INNER JOIN kunden k ON k.id = b.kunde_id;Nur Zeilen mit Treffer in beiden TabellenSELECT * FROM kunden k LEFT JOIN bestellungen b ON b.kunde_id = k.id;Alle Kunden, auch ohne Bestellung (Bestellspalten sind dann NULL)SELECT * FROM kunden k RIGHT JOIN bestellungen b ON b.kunde_id = k.id;Alle Bestellungen, auch ohne passenden KundenSELECT * FROM a FULL OUTER JOIN b ON a.id = b.a_id;Alle Zeilen beider Seiten (nicht in MySQL; SQLite ab 3.39)SELECT * FROM groessen CROSS JOIN farben;Jede Zeile mit jeder kombinierenSELECT m.name, c.name AS chef FROM mitarbeiter m LEFT JOIN mitarbeiter c ON c.id = m.chef_id;Self-Join: Tabelle mit sich selbst verbindenSELECT ort FROM kunden UNION SELECT ort FROM lieferanten;Ergebnisse untereinander, ohne Duplikate (UNION ALL mit)SELECT * FROM kunden WHERE id IN (SELECT kunde_id FROM bestellungen);UnterabfrageSELECT * FROM kunden k WHERE EXISTS (SELECT 1 FROM bestellungen b WHERE b.kunde_id = k.id);Prüfen, ob passende Zeilen existierenWITH top AS (SELECT kunde_id, SUM(betrag) s FROM bestellungen GROUP BY kunde_id) SELECT * FROM top WHERE s > 500;Common Table Expression (CTE) für lesbare AbfragenDaten ändern
INSERT INTO kunden (name, ort) VALUES ('Anna', 'Köln');Zeile einfügenINSERT INTO kunden (name, ort) VALUES ('Ben', 'Bonn'), ('Cem', 'Ulm');Mehrere Zeilen auf einmalINSERT INTO archiv SELECT * FROM kunden WHERE aktiv = 0;Ergebnis einer Abfrage einfügenUPDATE kunden SET ort = 'Bonn' WHERE id = 7;Werte ändern; ohne WHERE trifft es alle ZeilenDELETE FROM kunden WHERE id = 7;Zeilen löschen; ohne WHERE werden alle gelöschtTRUNCATE TABLE log;Tabelle schnell leeren (SQLite: DELETE FROM log;)INSERT INTO lager (id, menge) VALUES (1, 5) ON CONFLICT (id) DO UPDATE SET menge = excluded.menge;Upsert in PostgreSQL und SQLiteINSERT INTO lager (id, menge) VALUES (1, 5) ON DUPLICATE KEY UPDATE menge = VALUES(menge);Upsert in MySQL und MariaDB (MySQL 8.0.20+ empfiehlt einen Alias statt VALUES())Tabellen und Indizes
CREATE TABLE kunden (id INTEGER PRIMARY KEY, name VARCHAR(100) NOT NULL, ort VARCHAR(100), erstellt TIMESTAMP DEFAULT CURRENT_TIMESTAMP);Tabelle anlegenCREATE TABLE IF NOT EXISTS log (id INTEGER PRIMARY KEY, text TEXT);Nur anlegen, wenn sie noch fehltALTER TABLE kunden ADD COLUMN telefon VARCHAR(30);Spalte hinzufügenALTER TABLE kunden DROP COLUMN telefon;Spalte entfernenALTER TABLE kunden RENAME TO kundschaft;Tabelle umbenennen (SQL Server: sp_rename)DROP TABLE IF EXISTS kunden;Tabelle mit allen Daten löschenCREATE INDEX idx_kunden_ort ON kunden (ort);Index für schnellere SucheCREATE UNIQUE INDEX idx_kunden_email ON kunden (email);Index, der doppelte Werte verhindertDROP INDEX idx_kunden_ort;Index löschen (MySQL: DROP INDEX idx_kunden_ort ON kunden;)ALTER TABLE bestellungen ADD CONSTRAINT fk_kunde FOREIGN KEY (kunde_id) REFERENCES kunden (id);Fremdschlüssel anlegenCREATE VIEW aktive_kunden AS SELECT * FROM kunden WHERE aktiv = 1;Sicht (View) anlegenTransaktionen, Rechte, Analyse
BEGIN;Transaktion starten (MySQL auch START TRANSACTION;)COMMIT;Änderungen der Transaktion festschreibenROLLBACK;Änderungen der Transaktion verwerfenGRANT SELECT, INSERT ON kunden TO app_user;Rechte vergebenREVOKE INSERT ON kunden FROM app_user;Rechte entziehenEXPLAIN SELECT * FROM kunden WHERE ort = 'Berlin';Ausführungsplan anzeigen, etwa ob ein Index genutzt wirdFensterfunktionen
SELECT name, ROW_NUMBER() OVER (PARTITION BY ort ORDER BY umsatz DESC) AS platz FROM kunden;Rangfolge je GruppeSELECT datum, SUM(betrag) OVER (ORDER BY datum) AS laufend FROM bestellungen;Laufende SummeSELECT name, RANK() OVER (ORDER BY umsatz DESC) FROM kunden;Rang mit Lücken bei Gleichstand (DENSE_RANK ohne)SELECT datum, betrag - LAG(betrag) OVER (ORDER BY datum) AS diff FROM bestellungen;Differenz zur vorherigen ZeileKein Eintrag gefunden. Versuchen Sie einen anderen Begriff oder wählen Sie „Alle Gruppen“.
Alles läuft in Ihrem Browser. Eingaben verlassen Ihr Gerät nicht.
SQL Befehle Liste mit Beispielen
Der SQL Spickzettel zeigt 58 Befehle mit konkreten Beispielen statt abstrakter Syntax: Abfragen mit SELECT und WHERE, Gruppieren mit GROUP BY und HAVING, alle Arten von SQL JOIN, Daten ändern, Tabellen und Indizes anlegen sowie Transaktionen und Fensterfunktionen. Die Beispiele nutzen die Tabellen kunden und bestellungen; ersetzen Sie die Namen durch Ihre eigenen.
Die Befehle folgen dem SQL-Standard und laufen in PostgreSQL, MySQL, MariaDB und SQLite. Wo sich die Datenbanken unterscheiden, etwa bei LIMIT, Upsert oder TRUNCATE, steht der Hinweis direkt dabei. Ein typischer Stolperstein: Vergleiche mit NULL brauchen IS NULL, denn = NULL ist nie wahr. Und UPDATE oder DELETE ohne WHERE treffen alle Zeilen; testen Sie die Bedingung vorher mit einem SELECT.
Dieses SQL Cheat Sheet ersetzt nicht die Handbücher der einzelnen Datenbanken, deckt aber die Befehle ab, die im Alltag am häufigsten gebraucht werden. Lange Abfragen werden mit einem SQL-Formatierer lesbarer; Ergebnisse als JSON lassen sich mit JSON formatieren prüfen.
Anleitung: SQL-Befehle in 4 Schritten
- Im Feld „Suchen“ einen Befehl oder ein Stichwort eingeben, etwa JOIN, Upsert oder NULL.
- Über „Gruppe“ die Liste auf einen Bereich wie „Tabellen verbinden (JOIN)“ oder „Fensterfunktionen“ eingrenzen.
- Ein Beispiel mit „Kopieren“ übernehmen und die Tabellennamen kunden und bestellungen durch eigene ersetzen.
- Die Hinweise zu MySQL, PostgreSQL und SQLite beachten, wo sich die Syntax unterscheidet.
Typische Anwendungsfälle
- Schnell nachsehen, wie ein LEFT JOIN oder eine Unterabfrage mit EXISTS geschrieben wird.
- Den passenden Upsert finden: ON CONFLICT in PostgreSQL und SQLite oder ON DUPLICATE KEY UPDATE in MySQL.
- Auswertungen mit GROUP BY, HAVING und Fensterfunktionen wie ROW_NUMBER() vorbereiten.
- Vor einem UPDATE oder DELETE die WHERE-Bedingung zuerst mit einem SELECT testen.
Häufige Fragen
Was ist der Unterschied zwischen INNER JOIN und LEFT JOIN?
INNER JOIN liefert nur Zeilen, die in beiden Tabellen einen Treffer haben. LEFT JOIN liefert alle Zeilen der linken Tabelle; fehlt rechts ein Treffer, sind die Spalten der rechten Tabelle NULL.
Was ist der Unterschied zwischen WHERE und HAVING?
WHERE filtert einzelne Zeilen, bevor gruppiert wird. HAVING filtert danach die Gruppen und kann deshalb Aggregatfunktionen wie COUNT(*) oder SUM() verwenden.
Wie begrenze ich die Anzahl der Ergebnisse?
In MySQL, PostgreSQL und SQLite mit LIMIT 10, zum Blättern mit OFFSET. Standard-SQL und SQL Server nutzen OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY, ältere SQL-Server-Versionen SELECT TOP 10.
Warum findet WHERE spalte = NULL nichts?
NULL bedeutet „unbekannt“, und ein Vergleich mit Unbekanntem ergibt weder wahr noch falsch. Verwenden Sie IS NULL oder IS NOT NULL.
Wie verhindere ich SQL-Injection?
Setzen Sie Nutzereingaben nie per Zeichenkettenverkettung in SQL ein, sondern nutzen Sie vorbereitete Anweisungen (Prepared Statements) mit Platzhaltern. Die Datenbank behandelt die Werte dann immer als Daten, nie als Befehl.
Was ist der Unterschied zwischen DELETE, TRUNCATE und DROP?
DELETE entfernt Zeilen und lässt sich mit WHERE einschränken. TRUNCATE leert die ganze Tabelle schneller, aber ohne Bedingung. DROP TABLE löscht die Tabelle samt Struktur und Daten.
Was ist der Unterschied zwischen UNION und UNION ALL?
UNION hängt die Ergebnisse zweier Abfragen untereinander und entfernt doppelte Zeilen. UNION ALL behält alle Zeilen und ist schneller, wenn Duplikate keine Rolle spielen.
Das könnte auch helfen
HTTP-Statuscodes
Alle gängigen HTTP-Statuscodes von 100 bis 511 mit Bedeutung, typischer Ursache und Suche.
ÖffnenHTTP-Header-Referenz
Wichtige Anfrage- und Antwort-Header mit Bedeutung und Beispiel, durchsuchbar.
ÖffnenMIME-Typen
Über 150 MIME-Typen nachschlagen: Dateiendung zu Content-Type und umgekehrt.
ÖffnenGit-Befehle
Git-Spickzettel: die wichtigsten Befehle nach Aufgaben gruppiert, durchsuchbar und kopierbar.
ÖffnenBash-Befehle
Bash- und Linux-Befehle für Dateien, Text, Prozesse und Netzwerk, mit Suche und Kopieren.
ÖffnenPort-Liste
Bekannte TCP- und UDP-Ports von 20 bis 51820 mit Dienst und Hinweis, durchsuchbar.
Öffnen