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 Tabelle
SELECT name, ort FROM kunden WHERE ort = 'Berlin';Bestimmte Spalten mit Bedingung
SELECT DISTINCT ort FROM kunden;Jeden Wert nur einmal
SELECT * FROM kunden ORDER BY name ASC, id DESC;Sortieren, aufsteigend und absteigend
SELECT * 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 eingeschlossen
SELECT * FROM kunden WHERE name LIKE 'M%';Muster: % beliebig viele Zeichen, _ genau eines
SELECT * FROM kunden WHERE ort IN ('Berlin', 'Hamburg');Wert aus einer Liste
SELECT * FROM kunden WHERE email IS NULL;Fehlende Werte; = NULL funktioniert nicht
SELECT name AS kunde FROM kunden k;Alias für Spalte und Tabelle
SELECT COALESCE(telefon, '-') FROM kunden;Ersten Wert nehmen, der nicht NULL ist
SELECT name, CASE WHEN umsatz > 1000 THEN 'A' ELSE 'B' END AS klasse FROM kunden;Bedingte Werte

Gruppieren und zählen

SELECT COUNT(*) FROM kunden;Zeilen zählen
SELECT COUNT(DISTINCT ort) FROM kunden;Verschiedene Werte zählen
SELECT SUM(betrag), AVG(betrag), MIN(betrag), MAX(betrag) FROM bestellungen;Summe, Durchschnitt, Minimum, Maximum
SELECT ort, COUNT(*) FROM kunden GROUP BY ort;Je Gruppe zählen
SELECT ort, COUNT(*) AS n FROM kunden GROUP BY ort HAVING COUNT(*) > 5;Gruppen filtern; WHERE filtert Zeilen vor dem Gruppieren, HAVING danach
SELECT kunde_id, SUM(betrag) FROM bestellungen GROUP BY kunde_id ORDER BY 2 DESC;Nach der Summe sortieren

Tabellen verbinden (JOIN)

SELECT * FROM bestellungen b INNER JOIN kunden k ON k.id = b.kunde_id;Nur Zeilen mit Treffer in beiden Tabellen
SELECT * 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 Kunden
SELECT * 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 kombinieren
SELECT 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 verbinden
SELECT 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);Unterabfrage
SELECT * FROM kunden k WHERE EXISTS (SELECT 1 FROM bestellungen b WHERE b.kunde_id = k.id);Prüfen, ob passende Zeilen existieren
WITH 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 Abfragen

Daten ändern

INSERT INTO kunden (name, ort) VALUES ('Anna', 'Köln');Zeile einfügen
INSERT INTO kunden (name, ort) VALUES ('Ben', 'Bonn'), ('Cem', 'Ulm');Mehrere Zeilen auf einmal
INSERT INTO archiv SELECT * FROM kunden WHERE aktiv = 0;Ergebnis einer Abfrage einfügen
UPDATE kunden SET ort = 'Bonn' WHERE id = 7;Werte ändern; ohne WHERE trifft es alle Zeilen
DELETE FROM kunden WHERE id = 7;Zeilen löschen; ohne WHERE werden alle gelöscht
TRUNCATE 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 SQLite
INSERT 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 anlegen
CREATE TABLE IF NOT EXISTS log (id INTEGER PRIMARY KEY, text TEXT);Nur anlegen, wenn sie noch fehlt
ALTER TABLE kunden ADD COLUMN telefon VARCHAR(30);Spalte hinzufügen
ALTER TABLE kunden DROP COLUMN telefon;Spalte entfernen
ALTER TABLE kunden RENAME TO kundschaft;Tabelle umbenennen (SQL Server: sp_rename)
DROP TABLE IF EXISTS kunden;Tabelle mit allen Daten löschen
CREATE INDEX idx_kunden_ort ON kunden (ort);Index für schnellere Suche
CREATE UNIQUE INDEX idx_kunden_email ON kunden (email);Index, der doppelte Werte verhindert
DROP 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 anlegen
CREATE VIEW aktive_kunden AS SELECT * FROM kunden WHERE aktiv = 1;Sicht (View) anlegen

Transaktionen, Rechte, Analyse

BEGIN;Transaktion starten (MySQL auch START TRANSACTION;)
COMMIT;Änderungen der Transaktion festschreiben
ROLLBACK;Änderungen der Transaktion verwerfen
GRANT SELECT, INSERT ON kunden TO app_user;Rechte vergeben
REVOKE INSERT ON kunden FROM app_user;Rechte entziehen
EXPLAIN SELECT * FROM kunden WHERE ort = 'Berlin';Ausführungsplan anzeigen, etwa ob ein Index genutzt wird

Fensterfunktionen

SELECT name, ROW_NUMBER() OVER (PARTITION BY ort ORDER BY umsatz DESC) AS platz FROM kunden;Rangfolge je Gruppe
SELECT datum, SUM(betrag) OVER (ORDER BY datum) AS laufend FROM bestellungen;Laufende Summe
SELECT 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 Zeile

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

  1. Im Feld „Suchen“ einen Befehl oder ein Stichwort eingeben, etwa JOIN, Upsert oder NULL.
  2. Über „Gruppe“ die Liste auf einen Bereich wie „Tabellen verbinden (JOIN)“ oder „Fensterfunktionen“ eingrenzen.
  3. Ein Beispiel mit „Kopieren“ übernehmen und die Tabellennamen kunden und bestellungen durch eigene ersetzen.
  4. 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.
Fragen

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.

Weitere Werkzeuge

Das könnte auch helfen

Alle 358 Werkzeuge