SQL-Befehle

KAPITEL 06 · DATENBANKEN

SQL-Befehle

Die vollständige Referenz der wichtigsten SQL-Befehle – von DDL über DML bis zu JOINs, Unterabfragen und Transaktionen. Mit praxisnahen Beispielen und Best Practices.

DDL DML JOINs DCL & TCL

Inhaltsverzeichnis

Schnellübersicht

  • Definition: Was ist SQL und wofür wird es eingesetzt?
  • DDL: CREATE, ALTER, DROP, TRUNCATE – Tabellenstrukturen verwalten
  • DML: SELECT, INSERT, UPDATE, DELETE – Daten manipulieren
  • DCL: GRANT, REVOKE – Berechtigungen steuern
  • TCL: COMMIT, ROLLBACK, SAVEPOINT – Transaktionen verwalten
  • JOINs: INNER, LEFT, RIGHT, FULL, CROSS
  • Aggregatfunktionen: COUNT, SUM, AVG, MIN, MAX
  • Unterabfragen & CTEs: Verschachtelte Abfragen
  • Best Practices: Performance, Sicherheit, Stil
  • FAQ: Häufige Fragen & Antworten

1. Was ist SQL?

Definition

SQL (Structured Query Language) ist die Standardsprache zur Verwaltung und Abfrage relationaler Datenbanken. Mit SQL können Sie Tabellen erstellen, Daten einfügen, ändern und löschen, komplexe Abfragen formulieren und Berechtigungen verwalten.

SQL wird von allen großen Datenbanksystemen unterstützt: MySQL, PostgreSQL, Microsoft SQL Server, Oracle, SQLite, MariaDB und vielen weiteren. Obwohl der SQL-Standard (ANSI/ISO) weitgehend einheitlich ist, hat jedes System eigene Erweiterungen und Dialekte.

SQL-Befehle werden in vier Kategorien unterteilt: DDL (Strukturdefinition), DML (Datenmanipulation), DCL (Berechtigungssteuerung) und TCL (Transaktionskontrolle).

2. Die vier SQL-Kategorien

DDL

Data Definition Language

Definiert und verändert die Struktur der Datenbank (Tabellen, Views, Indexes).

  • CREATE Tabelle, View, Index erstellen
  • ALTER Struktur ändern (Spalten hinzufügen)
  • DROP Objekt löschen
  • TRUNCATE Alle Zeilen löschen (Struktur bleibt)
  • RENAME Objekt umbenennen

DML

Data Manipulation Language

Bearbeitet die Daten innerhalb der Tabellen – der am häufigsten verwendete Bereich.

  • SELECT Daten abfragen
  • INSERT Neue Zeilen einfügen
  • UPDATE Vorhandene Zeilen ändern
  • DELETE Zeilen löschen
  • MERGE Einfügen oder Aktualisieren

DCL

Data Control Language

Steuert Zugriffsrechte und Berechtigungen auf Datenbankobjekte.

  • GRANT Rechte vergeben
  • REVOKE Rechte entziehen
  • DENY Rechte explizit verweigern (MSSQL)

TCL

Transaction Control Language

Verwaltet Transaktionen und sorgt für Datenkonsistenz (ACID-Prinzip).

  • COMMIT Transaktion bestätigen
  • ROLLBACK Transaktion zurücksetzen
  • SAVEPOINT Zwischenpunkt setzen
  • SET TRANSACTION Isolationsebene festlegen

3. DDL – Tabellenstrukturen verwalten

CREATE TABLE

Erstellt eine neue Tabelle mit definierten Spalten und Datentypen.

CREATE TABLE mitarbeiter ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE, gehalt DECIMAL(10,2), abt_id INT, FOREIGN KEY (abt_id) REFERENCES abteilungen(id) );

ALTER TABLE

Ändert die Struktur einer bestehenden Tabelle.

-- Spalte hinzufügen ALTER TABLE mitarbeiter ADD COLUMN geburtsdatum DATE; -- Spalte ändern ALTER TABLE mitarbeiter MODIFY COLUMN name VARCHAR(150); -- Spalte löschen ALTER TABLE mitarbeiter DROP COLUMN geburtsdatum;

DROP TABLE

Löscht eine Tabelle inklusive aller Daten und der Struktur.

DROP TABLE mitarbeiter; -- Nur löschen, wenn die Tabelle existiert DROP TABLE IF EXISTS mitarbeiter;

TRUNCATE TABLE

Löscht alle Zeilen einer Tabelle, behält aber die Struktur. Schneller als DELETE ohne WHERE.

TRUNCATE TABLE mitarbeiter; -- ⚠ Kann nicht mit ROLLBACK rückgängig -- gemacht werden (in den meisten DBs)

Wichtige Datentypen

  • INT / BIGINT: Ganze Zahlen
  • DECIMAL(p,s): Dezimalzahlen mit fester Genauigkeit
  • VARCHAR(n): Zeichenketten variabler Länge
  • TEXT: Lange Texte
  • DATE / DATETIME / TIMESTAMP: Datum und Uhrzeit
  • BOOLEAN: Wahr/Falsch
  • BLOB: Binäre Daten (Bilder, Dateien)

4. DML – Daten manipulieren

SELECT

Der wichtigste SQL-Befehl – fragt Daten aus einer oder mehreren Tabellen ab.

SELECT name, gehalt, abteilung FROM mitarbeiter WHERE gehalt > 50000 ORDER BY gehalt DESC LIMIT 10;

INSERT

Fügt neue Zeilen in eine Tabelle ein.

-- Einzelne Zeile INSERT INTO mitarbeiter (name, email, gehalt) VALUES ('Max Mustermann', 'max@firma.de', 55000.00); -- Mehrere Zeilen INSERT INTO mitarbeiter (name, email) VALUES ('Anna Schmidt', 'anna@firma.de'), ('Tom Weber', 'tom@firma.de');

UPDATE

Ändert vorhandene Daten. Immer WHERE verwenden!

UPDATE mitarbeiter SET gehalt = gehalt * 1.05, updated_at = NOW() WHERE abteilung = 'IT'; -- ⚠ Ohne WHERE werden ALLE Zeilen geändert!

DELETE

Löscht Zeilen aus einer Tabelle. Immer WHERE verwenden!

DELETE FROM mitarbeiter WHERE id = 42; -- Mit Bedingung DELETE FROM mitarbeiter WHERE abteilung = 'Vertrieb' AND gehalt < 30000; -- ⚠ Ohne WHERE werden ALLE Zeilen gelöscht!

5. SELECT vertieft – WHERE, ORDER BY, GROUP BY

SQL -- Vollständige SELECT-Syntax SELECT abteilung, COUNT(*) AS anzahl, AVG(gehalt) AS durchschnittsgehalt, MAX(gehalt) AS max_gehalt, MIN(gehalt) AS min_gehalt, SUM(gehalt) AS gesamt_gehalt FROM mitarbeiter WHERE status = 'aktiv' -- Zeilen filtern GROUP BY abteilung -- Gruppierung HAVING COUNT(*) > 5 -- Gruppen filtern ORDER BY durchschnittsgehalt DESC -- Sortierung LIMIT 10 OFFSET 0; -- Paginierung

Ausführungsreihenfolge

SQL-Befehle werden nicht in der Reihenfolge ausgeführt, in der sie geschrieben werden:

  1. FROM / JOIN – Tabellen bestimmen
  2. WHERE – Zeilen filtern
  3. GROUP BY – Gruppieren
  4. HAVING – Gruppen filtern
  5. SELECT – Spalten auswählen
  6. ORDER BY – Sortieren
  7. LIMIT / OFFSET – Ergebnis begrenzen

6. Aggregatfunktionen

Funktion Beschreibung Beispiel Ergebnis
COUNT(*) Anzahl aller Zeilen COUNT(*) 42
COUNT(col) Anzahl nicht-NULL-Werte COUNT(email) 40
SUM() Summe aller Werte SUM(gehalt) 2.340.000
AVG() Durchschnittswert AVG(gehalt) 55.714
MIN() Kleinster Wert MIN(gehalt) 28.000
MAX() Größter Wert MAX(gehalt) 120.000
GROUP_CONCAT() Werte zu String verbinden GROUP_CONCAT(name) 'Max, Anna, Tom'

7. JOINs – Tabellen verknüpfen

JOINs verbinden Daten aus zwei oder mehr Tabellen basierend auf einer gemeinsamen Spalte.

INNER JOIN

A
B

Nur Zeilen, die in beiden Tabellen ein Match haben.

LEFT JOIN

A
B

Alle Zeilen aus links, plus passende aus rechts (sonst NULL).

RIGHT JOIN

A
B

Alle Zeilen aus rechts, plus passende aus links (sonst NULL).

FULL OUTER JOIN

A
B

Alle Zeilen aus beiden Tabellen (NULL wo kein Match).

CROSS JOIN

A
B

Kartesisches Produkt – jede Zeile von A mit jeder von B.

SQL -- INNER JOIN: Mitarbeiter mit ihrer Abteilung SELECT m.name, m.gehalt, a.name AS abteilung FROM mitarbeiter m INNER JOIN abteilungen a ON m.abt_id = a.id WHERE m.gehalt > 50000 ORDER BY m.gehalt DESC; -- LEFT JOIN: Alle Mitarbeiter, auch ohne Abteilung SELECT m.name, a.name AS abteilung FROM mitarbeiter m LEFT JOIN abteilungen a ON m.abt_id = a.id;

8. Unterabfragen & CTEs

Unterabfrage (Subquery)

Eine Abfrage innerhalb einer anderen Abfrage.

-- Mitarbeiter mit überdurchschnittlichem Gehalt SELECT name, gehalt FROM mitarbeiter WHERE gehalt > ( SELECT AVG(gehalt) FROM mitarbeiter );

CTE (Common Table Expression)

Temporäre, benannte Ergebnismenge – besser lesbar als verschachtelte Subqueries.

WITH abt_stats AS ( SELECT abt_id, AVG(gehalt) AS avg_gehalt FROM mitarbeiter GROUP BY abt_id ) SELECT m.name, m.gehalt, s.avg_gehalt FROM mitarbeiter m JOIN abt_stats s ON m.abt_id = s.abt_id WHERE m.gehalt > s.avg_gehalt;

9. DCL & TCL – Berechtigungen & Transaktionen

GRANT

Vergibt Berechtigungen an Benutzer oder Rollen.

GRANT SELECT, INSERT, UPDATE ON mitarbeiter TO 'app_user'@'localhost'; GRANT ALL PRIVILEGES ON firma_db.* TO 'admin'@'%';

REVOKE

Entzieht zuvor vergebene Berechtigungen.

REVOKE DELETE ON mitarbeiter FROM 'app_user'@'localhost';

COMMIT & ROLLBACK

Bestätigt oder setzt eine Transaktion zurück (ACID-Prinzip).

BEGIN TRANSACTION; UPDATE konten SET saldo = saldo - 100 WHERE id = 1; UPDATE konten SET saldo = saldo + 100 WHERE id = 2; COMMIT; -- Beide oder keiner -- ROLLBACK; -- Bei Fehler zurücksetzen

SAVEPOINT

Setzt einen Zwischenpunkt innerhalb einer Transaktion.

BEGIN TRANSACTION; INSERT INTO log VALUES ('Start'); SAVEPOINT sp1; INSERT INTO log VALUES ('Schritt 2'); -- Fehler tritt auf: ROLLBACK TO sp1; -- Nur Schritt 2 wird rückgängig gemacht COMMIT;

10. Best Practices

Performance

  • Nur benötigte Spalten abfragen (kein SELECT *)
  • Indexe auf häufig gefilterte Spalten setzen
  • EXPLAIN / EXPLAIN ANALYZE zur Query-Optimierung nutzen
  • N+1-Queries vermeiden (JOINs statt Loops)
  • LIMIT für große Ergebnismengen verwenden

Sicherheit

  • Prepared Statements gegen SQL-Injection
  • Prinzip der geringsten Rechte (Least Privilege)
  • Niemals Benutzereingaben direkt in SQL einfügen
  • Sensible Daten verschlüsseln
  • Audit-Logs für kritische Operationen

Code-Stil

  • SQL-Schlüsselwörter GROSS schreiben
  • Tabellen- und Spaltennamen klein_mit_unterstrich
  • Komplexe Queries kommentieren
  • Aliase für Tabellen verwenden (m, a, o)
  • Konsistente Einrückung und Formatierung

Transaktionen

  • UPDATE und DELETE immer in Transaktionen
  • Immer WHERE-Klausel bei UPDATE/DELETE
  • Transaktionen so kurz wie möglich halten
  • Deadlocks vermeiden (gleiche Reihenfolge)
  • Backup vor Massen-Operationen

Die gefährlichsten Fehler

  • UPDATE ohne WHERE: Ändert ALLE Zeilen in der Tabelle
  • DELETE ohne WHERE: Löscht ALLE Zeilen in der Tabelle
  • DROP TABLE: Löscht die gesamte Tabelle unwiederbringlich
  • SQL-Injection: Unsichere String-Verkettung erlaubt Angriffe
  • SELECT *: Holt unnötig viele Daten und verlangsamt die Abfrage

11. FAQ – Häufige Fragen & Antworten

Häufige Fragen zu SQL

Was ist der Unterschied zwischen DELETE und TRUNCATE?

DELETE: Löscht Zeilen einzeln, kann mit WHERE gefiltert werden, kann mit ROLLBACK rückgängig gemacht werden, löst Trigger aus. Langsamer bei vielen Zeilen.

TRUNCATE: Löscht alle Zeilen auf einmal, kann NICHT mit WHERE gefiltert werden, ist in den meisten Datenbanken nicht rollback-fähig, setzt AUTO_INCREMENT zurück. Deutlich schneller.

Regel: TRUNCATE für "alles löschen", DELETE für "bestimmte Zeilen löschen".

Was ist eine SQL-Injection und wie schütze ich mich dagegen?

SQL-Injection ist ein Angriff, bei dem ein Angreifer schädlichen SQL-Code über Eingabefelder einschleust:

-- ❌ Gefährlich: String-Verkettung query = "SELECT * FROM users WHERE name = '" + userInput + "'" -- Eingabe: ' OR 1=1 -- -- Ergibt: SELECT * FROM users WHERE name = '' OR 1=1 --'

Schutz: Immer Prepared Statements (parametrisierte Queries) verwenden:

-- ✅ Sicher: Prepared Statement SELECT * FROM users WHERE name = ?
Wann sollte ich einen Index erstellen?

Index erstellen auf Spalten, die:

  • Häufig in WHERE-Klauseln verwendet werden
  • In JOIN-Bedingungen vorkommen
  • In ORDER BY verwendet werden
  • Fremdschlüssel (Foreign Keys) sind

Keinen Index erstellen auf:

  • Sehr kleine Tabellen (Full Scan ist schneller)
  • Spalten mit wenigen unterschiedlichen Werten (z.B. Boolean)
  • Tabellen mit sehr vielen INSERT/UPDATE-Operationen (Index verlangsamt Schreiben)
Was ist der Unterschied zwischen WHERE und HAVING?

WHERE: Filtert Zeilen vor der Gruppierung. Kann keine Aggregatfunktionen verwenden.

HAVING: Filtert Gruppen nach der Gruppierung. Kann Aggregatfunktionen verwenden.

SELECT abteilung, COUNT(*) AS anzahl FROM mitarbeiter WHERE status = 'aktiv' -- Filtert VOR Gruppierung GROUP BY abteilung HAVING COUNT(*) > 5; -- Filtert NACH Gruppierung
Was bedeutet NULL in SQL und wie gehe ich damit um?

NULL bedeutet "unbekannt" oder "nicht vorhanden" – es ist nicht dasselbe wie 0 oder ein leerer String.

  • IS NULL / IS NOT NULL – auf NULL prüfen
  • COALESCE(wert, ersatz) – Ersatzwert bei NULL
  • IFNULL(wert, ersatz) – MySQL-spezifisch
  • NULL = NULL ergibt UNKNOWN, nicht TRUE
  • Aggregatfunktionen ignorieren NULL-Werte (außer COUNT(*))
Was sind die ACID-Eigenschaften von Transaktionen?

ACID garantiert die Zuverlässigkeit von Datenbanktransaktionen:

  • Atomicity (Atomarität): Alles oder nichts – die Transaktion wird ganz oder gar nicht ausgeführt
  • Consistency (Konsistenz): Die Datenbank bleibt in einem gültigen Zustand
  • Isolation (Isolation): Gleichzeitige Transaktionen beeinflussen sich nicht gegenseitig
  • Durability (Dauerhaftigkeit): Nach COMMIT sind die Daten dauerhaft gespeichert
Wie optimiere ich langsame SQL-Queries?

Schritt-für-Schritt-Ansatz:

  1. EXPLAIN ANALYZE: Ausführungsplan analysieren
  2. Indexe prüfen: Werden die richtigen Indexe genutzt?
  3. SELECT *: Nur benötigte Spalten abfragen
  4. N+1-Problem: JOINs statt einzelner Abfragen in Schleifen
  5. Subqueries: Durch JOINs oder CTEs ersetzen
  6. Paginierung: LIMIT/OFFSET oder Keyset-Pagination
  7. Partitionierung: Große Tabellen aufteilen

Zusammenfassung

Die wichtigsten Punkte

  • DDL: CREATE, ALTER, DROP, TRUNCATE – Tabellenstruktur verwalten
  • DML: SELECT, INSERT, UPDATE, DELETE – Daten manipulieren
  • DCL: GRANT, REVOKE – Berechtigungen steuern
  • TCL: COMMIT, ROLLBACK, SAVEPOINT – Transaktionen verwalten
  • JOINs: INNER, LEFT, RIGHT, FULL, CROSS – Tabellen verknüpfen
  • Aggregatfunktionen: COUNT, SUM, AVG, MIN, MAX
  • CTEs: Besser lesbar als verschachtelte Subqueries
  • Sicherheit: Immer Prepared Statements gegen SQL-Injection
  • Performance: Indexe, EXPLAIN, kein SELECT *
  • Immer WHERE: Bei UPDATE und DELETE niemals WHERE vergessen

Weiterführende Themen

Datenbank-Grundlagen

Relationale Datenbanken, Normalisierung, ER-Modelle und Schlüssel.

Zu Datenbank-Grundlagen
SQL-Datenbanken

MySQL, PostgreSQL, MSSQL, Oracle – Vergleich und Einsatzgebiete.

Zu SQL-Datenbanken
Datenbank-Optimierung

Indexe, Query-Optimierung, Partitionierung und Performance-Tuning.

Zur Optimierung
Replikation & Sharding

Datenbanken skalieren – Master-Slave, Multi-Master, horizontale Aufteilung.

Zur Replikation