SQL Grundlagen Schulung – Kursbezug
Worum geht’s?
- Sie fügen Daten ein (INSERT), ändern sie (UPDATE) und löschen sie (DELETE).
- Sie lernen einen Safety-Workflow, der in der Praxis Pannen verhindert.
- Sie nutzen Transaktionen, um Änderungen kontrolliert zu übernehmen oder zurückzurollen.
Safety
UPDATE/DELETE: Erst SELECT ... WHERE ... prüfen → dann UPDATE/DELETE mit identischer WHERE.
Schema (Kontext)
-- kurse(kurs_id, kurs_name)
-- trainer(trainer_id, name)
-- termine(termin_id, kurs_id, trainer_id, start_datum, ort, format, dauer_tage, preis_eur)
-- buchungen(buchung_id, termin_id, name, email, created_at)Lehr-/Lernziele
- (LZ1) INSERT in beiden Formen anwenden (VALUES, INSERT…SELECT).
- (LZ2) UPDATE sicher anwenden (WHERE, „Preview-SELECT“, betroffene Zeilen).
- (LZ3) DELETE sicher anwenden (WHERE, „Preview-SELECT“, FK-Fallen verstehen).
- (LZ4) Änderungen über Transaktionen kontrollieren (BEGIN/COMMIT/ROLLBACK).
INSERT
-- 1) Kurs anlegen
INSERT INTO kurse (kurs_id, kurs_name)
VALUES (10, 'SQL Grundlagen Schulung');
-- 2) Trainer anlegen
INSERT INTO trainer (trainer_id, name)
VALUES (10, 'Gasttrainer');
-- 3) Termin anlegen (trainer_id optional -> kann auch NULL sein)
INSERT INTO termine (
termin_id, kurs_id, trainer_id, start_datum, ort, format, dauer_tage, preis_eur
) VALUES (
1001, 10, 10, '2026-02-23', 'Hamburg', 'Praesenz', 3, 1428.00
);
-- 4) Buchung anlegen (FK: buchungen.termin_id -> termine.termin_id)
INSERT INTO buchungen (buchung_id, termin_id, name, email)
VALUES (5001, 1001, 'Max Mustermann', 'max@example.com');INSERT mehrerer Zeilen (Batch)
-- Mehrere Termine in einem Rutsch (SQLite/MySQL/PostgreSQL gängig)
INSERT INTO termine (
termin_id, kurs_id, trainer_id, start_datum, ort, format, dauer_tage, preis_eur
) VALUES
(1002, 10, NULL, '2026-03-09', 'Hamburg', 'Online', 3, 1428.00),
(1003, 10, 10, '2026-04-14', 'Berlin', 'Praesenz', 3, 1490.00);INSERT…SELECT (Daten aus Query übernehmen)
-- Beispiel: Eine Buchung für alle Termine eines Kurses erzeugen (didaktisch!)
-- In echt: eher NICHT so, aber zeigt INSERT...SELECT.
INSERT INTO buchungen (buchung_id, termin_id, name, email)
SELECT
900000 + t.termin_id AS buchung_id,
t.termin_id,
'Testkunde' AS name,
'test@example.com' AS email
FROM termine AS t
WHERE t.kurs_id = 10;UPDATE
Workflow: 1) SELECT → 2) BEGIN → 3) UPDATE → 4) Prüfen → 5) COMMIT/ROLLBACK
-- Preview: Welche Termine wären betroffen?
SELECT termin_id, kurs_id, start_datum, ort, format, preis_eur
FROM termine
WHERE kurs_id = 10
AND format = 'Online';-- Preis für Online-Termine des Kurses anpassen (mit WHERE!)
UPDATE termine
SET preis_eur = preis_eur + 50.00
WHERE kurs_id = 10
AND format = 'Online';Typischer Unfall: UPDATE ohne WHERE
-- NICHT so! Ohne WHERE werden ALLE Zeilen geändert.
-- UPDATE termine SET preis_eur = 1490.00;
-- Besser: Primärschlüssel nutzen (maximal eindeutig)
UPDATE termine
SET preis_eur = 1490.00
WHERE termin_id = 1002;DELETE
-- Preview: Welche Buchungen würden gelöscht?
SELECT buchung_id, termin_id, name, email, created_at
FROM buchungen
WHERE email = 'test@example.com';-- Löschen (mit WHERE!)
DELETE FROM buchungen
WHERE email = 'test@example.com';FK-Falle: Termin löschen trotz Buchungen?
-- Wenn buchungen(termin_id) per FOREIGN KEY auf termine(termin_id) zeigt,
-- kann das Löschen eines Termins scheitern, solange Buchungen existieren.
-- 1) Erst Child-Records löschen ...
DELETE FROM buchungen
WHERE termin_id = 1001;
-- ... dann Parent löschen:
DELETE FROM termine
WHERE termin_id = 1001;
-- Alternative (Schema-Entscheidung): ON DELETE CASCADE beim FK,
-- dann würden Buchungen automatisch mitgelöscht. (High impact!)Transaktionen (BEGIN / COMMIT / ROLLBACK)
-- Typischer Safety-Flow (DB-abhängig: BEGIN / START TRANSACTION)
BEGIN;
-- Preview
SELECT termin_id, preis_eur
FROM termine
WHERE termin_id = 1002;
-- Änderung
UPDATE termine
SET preis_eur = preis_eur + 50.00
WHERE termin_id = 1002;
-- Prüfen
SELECT termin_id, preis_eur
FROM termine
WHERE termin_id = 1002;
-- Entscheiden:
-- COMMIT; -- übernehmen
-- ROLLBACK; -- zurückrollenTypische Stolperfallen
- UPDATE/DELETE ohne WHERE → fast immer Katastrophe.
- Falsche WHERE (zu breit) → immer zuerst Preview-SELECT.
- Foreign Keys: Parent löschen kann scheitern (oder kaskadieren, wenn CASCADE aktiv ist).
- Autocommit: Änderungen sind sofort „live“, wenn keine Transaktion genutzt wird (Tool/DB abhängig).
Praxisaufgabe
- Füge einen Kurs und einen Termin ein (INSERT).
- Füge eine Buchung für den Termin ein (INSERT).
- Ändere den Preis des Termins (UPDATE) – mit Preview-SELECT.
- Lösche testweise die Buchung (DELETE) – mit Preview-SELECT.
- Führe UPDATE/DELETE innerhalb einer Transaktion aus und entscheide dich für COMMIT/ROLLBACK.
Lösungsvorschlag anzeigen
-- 1) Kurs + Termin anlegen
INSERT INTO kurse (kurs_id, kurs_name)
VALUES (20, 'SQL Grundlagen Schulung (Praxis)');
INSERT INTO termine (
termin_id, kurs_id, trainer_id, start_datum, ort, format, dauer_tage, preis_eur
) VALUES (
2001, 20, NULL, '2026-06-01', 'Hamburg', 'Online', 3, 1428.00
);
-- 2) Buchung anlegen
INSERT INTO buchungen (buchung_id, termin_id, name, email)
VALUES (8001, 2001, 'Erika Musterfrau', 'erika@example.com');
-- 3+4+5) Sicher ändern in Transaktion
BEGIN;
-- Preview Preis
SELECT termin_id, preis_eur
FROM termine
WHERE termin_id = 2001;
-- Update Preis
UPDATE termine
SET preis_eur = preis_eur + 50.00
WHERE termin_id = 2001;
-- Preview Delete (Buchung)
SELECT buchung_id, termin_id, email
FROM buchungen
WHERE buchung_id = 8001;
-- Delete Buchung
DELETE FROM buchungen
WHERE buchung_id = 8001;
-- Entscheiden:
-- COMMIT;
-- ROLLBACK;Kurz-Takeaways
- LZ1: INSERT kann VALUES oder SELECT als Quelle nutzen.
- LZ2: UPDATE immer mit WHERE + Preview-SELECT (gern per PK).
- LZ3: DELETE nur mit klarer WHERE; FK-Beziehungen beachten (Reihenfolge/CASCADE).
- LZ4: Transaktionen geben Kontrolle: COMMIT oder ROLLBACK.