Skip to content

Kapitel 6: DML - Daten bearbeiten

DML (Data Manipulation Language) wird verwendet, um Daten in Tabellen zu manipulieren (einfügen, ändern, löschen).

DML-Befehle:
- INSERT → Daten einfügen
- UPDATE → Daten ändern
- DELETE → Daten löschen

Wichtig: DML ändert nur die Daten, nicht die Struktur der Tabelle!

6.1 Daten einfügen (INSERT) ⭐

1. Basis-Syntax

sql
INSERT INTO tabellen_name (feld1, feld2, ...)
VALUES (wert1, wert2, ...);

Beispiel:

sql
-- Einzelnen Datensatz einfügen
INSERT INTO users (username, email, passwort)
VALUES ('max_mustermann', 'max@email.de', 'geheim123');

2. Alle Felder auffüllen (Reihenfolge beachten!)

sql
-- Wenn alle Felder befüllt werden, können Spaltennamen weggelassen werden
-- ACHTUNG: Reihenfolge muss exakt der Tabellenstruktur entsprechen!
INSERT INTO users VALUES (NULL, 'lisa_schmidt', 'lisa@email.de', 'pass456', NOW(), 1);

Aber besser (lesbarer):

sql
INSERT INTO users (username, email, passwort)
VALUES ('lisa_schmidt', 'lisa@email.de', 'pass456');

3. Mehrere Datensätze auf einmal einfügen (Bulk Insert)

sql
INSERT INTO users (username, email, passwort)
VALUES 
    ('user1', 'user1@email.de', 'pass1'),
    ('user2', 'user2@email.de', 'pass2'),
    ('user3', 'user3@email.de', 'pass3');

Vorteile:

  • ✅ Schneller als einzelne INSERTs
  • ✅ Weniger Netzwerkverkehr
  • ✅ Besser für große Datenmengen

4. Wichtige Hinweise

Achtung 1: Werte-Typ muss zum Feld-Typ passen!

sql
-- ❌ Falsch: Text in INT-Feld
INSERT INTO users (user_id, username) VALUES ('eins', 'test');  -- Fehler!

-- ✅ Richtig
INSERT INTO users (user_id, username) VALUES (1, 'test');

Achtung 2: Strings müssen in einfache Anführungszeichen gesetzt werden!

sql
-- ❌ Falsch (doppelte Anführungszeichen)
INSERT INTO users (username) VALUES ("max");  -- Funktioniert manchmal, aber nicht empfohlen

-- ✅ Richtig
INSERT INTO users (username) VALUES ('max');

Achtung 3: AUTO_INCREMENT Felder können weggelassen werden (oder NULL setzen)

sql
-- user_id ist AUTO_INCREMENT
INSERT INTO users (user_id, username, email) 
VALUES (NULL, 'max', 'max@email.de');  -- user_id wird automatisch vergeben

6.2 Daten ändern (UPDATE) ⭐⭐ Wichtig!

1. Basis-Syntax

sql
UPDATE tabellen_name
SET feld1 = wert1, feld2 = wert2, ...
WHERE bedingung;

Beispiel:

sql
-- Benutzer mit ID 1 aktualisieren
UPDATE users
SET email = 'neue_email@email.de', passwort = 'neues_passwort'
WHERE user_id = 1;

2. ⚠️ WICHTIG: WHERE-Bedingung IMMER angeben!

sql
-- ❌ GEFÄHRLICH: Ändert ALLE Datensätze!
UPDATE users SET passwort = 'neues_passwort';
-- JETZT haben ALLE Benutzer das gleiche Passwort!

-- ✅ SICHER: Nur einen bestimmten Benutzer ändern
UPDATE users SET passwort = 'neues_passwort'
WHERE user_id = 1;

Tipp: Immer erst mit SELECT testen, welche Datensätze betroffen sind!

sql
-- Erst prüfen:
SELECT * FROM users WHERE email = 'alt@email.de';

-- Dann ändern:
UPDATE users SET email = 'neu@email.de' 
WHERE email = 'alt@email.de';

3. Mehrere Felder auf einmal ändern

sql
UPDATE users
SET 
    email = 'max.neu@email.de',
    passwort = 'neues_sicheres_passwort',
    ist_aktiv = 0
WHERE user_id = 1;

4. Felder mit Berechnungen ändern

sql
-- Preis um 10% erhöhen
UPDATE products
SET preis = preis * 1.10
WHERE kategorie_id = 1;

-- Bestand verringern
UPDATE products
SET bestand = bestand - 1
WHERE produkt_id = 42;

6.3 Daten löschen (DELETE) ⭐⭐ Wichtig!

1. Basis-Syntax

sql
DELETE FROM tabellen_name
WHERE bedingung;

Beispiel:

sql
-- Benutzer mit ID 5 löschen
DELETE FROM users
WHERE user_id = 5;

2. ⚠️ WICHTIG: WHERE-Bedingung IMMER angeben!

sql
-- ❌ KATASTROPHE: Löscht ALLE Datensätze!
DELETE FROM users;
-- ALLE Benutzer sind weg! (Kann nicht rückgängig gemacht werden!)

-- ✅ SICHER: Nur einen bestimmten Datensatz löschen
DELETE FROM users WHERE user_id = 5;

3. DELETE vs TRUNCATE

DELETETRUNCATE
SyntaxDELETE FROM tabelle WHERE ...TRUNCATE TABLE tabelle
GeschwindigkeitLangsam (zeile für Zeile)Sehr schnell (ganze Tabelle auf einmal)
WHEREJa (einzelne Zeilen löschen)Nein (löscht ALLES)
Auto_IncrementBleibt erhaltenWir auf 1 zurückgesetzt
RückgängigJa (mit TRANSACTION)Nein

Beispiel:

sql
-- Langsam, aber flexibel (nur bestimmte löschen)
DELETE FROM users WHERE ist_aktiv = 0;

-- Sehr schnell, aber löscht ALLES
TRUNCATE TABLE users;  -- Achtung!

6.4 Praxisbeispiel: Daten einfügen, ändern, löschen

Szenario: Verwalte die Benutzer einer Webseite.

Schritt 1: Tabelle erstellen

sql
CREATE DATABASE IF NOT EXISTS webseite_db;
USE webseite_db;

CREATE TABLE users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL,
    passwort VARCHAR(255) NOT NULL,
    ist_aktiv BOOLEAN DEFAULT 1,
    erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Schritt 2: Daten einfügen (INSERT)

sql
-- Einen Benutzer einfügen
INSERT INTO users (username, email, passwort)
VALUES ('max_mustermann', 'max@email.de', 'pass123');

-- Mehrere Benutzer auf einmal einfügen
INSERT INTO users (username, email, passwort)
VALUES 
    ('lisa_schmidt', 'lisa@email.de', 'pass456'),
    ('john_doe', 'john@email.de', 'pass789'),
    ('jane_doe', 'jane@email.de', 'pass101112');

Schritt 3: Daten abfragen (Kontrolle)

sql
SELECT * FROM users;

Ausgabe:

+---------+------------------+-------------------+-----------+------------+---------------------+
| user_id | username         | email             | passwort | ist_aktiv | erstellt_am        |
+---------+------------------+-------------------+-----------+------------+---------------------+
|       1 | max_mustermann   | max@email.de     | pass123  |          1 | 2024-01-15 10:30:00 |
|       2 | lisa_schmidt    | lisa@email.de    | pass456  |          1 | 2024-01-15 10:31:00 |
|       3 | john_doe         | john@email.de     | pass789  |          1 | 2024-01-15 10:32:00 |
|       4 | jane_doe         | jane@email.de     | pass101  |          1 | 2024-01-15 10:33:00 |
+---------+------------------+-------------------+-----------+------------+---------------------+

Schritt 4: Daten ändern (UPDATE)

sql
-- E-Mail von Benutzer 1 ändern
UPDATE users 
SET email = 'max.neu@email.de'
WHERE user_id = 1;

-- Benutzer 3 deaktivieren
UPDATE users 
SET ist_aktiv = 0
WHERE user_id = 3;

Schritt 5: Daten löschen (DELETE)

sql
-- Benutzer 4 löschen
DELETE FROM users 
WHERE user_id = 4;

Schritt 6: Ergebnis prüfen

sql
SELECT * FROM users;

Ausgabe nach Änderungen:

+---------+------------------+-------------------+-----------+------------+
| user_id | username         | email             | passwort | ist_aktiv |
+---------+------------------+-------------------+-----------+------------+
|       1 | max_mustermann   | max.neu@email.de | pass123  |          1 |
|       2 | lisa_schmidt    | lisa@email.de    | pass456  |          1 |
|       3 | john_doe         | john@email.de     | pass789  |          0 |
+---------+------------------+-------------------+-----------+------------+

Häufige Fehler für Einsteiger

Fehler 1: Datentypen stimmen nicht überein

sql
-- ❌ Falsch: Text in INT-Feld
INSERT INTO users (user_id, username) VALUES ('eins', 'test');

-- ✅ Richtig
INSERT INTO users (user_id, username) VALUES (1, 'test');

Fehler 2: Strings ohne Anführungszeichen

sql
-- ❌ Falsch
INSERT INTO users (username, email) VALUES (max, max@email.de);

-- ✅ Richtig
INSERT INTO users (username, email) VALUES ('max', 'max@email.de');

Fehler 3: UPDATE/DELETE ohne WHERE (Gefährlich!)

sql
-- ❌ Gefährlich! Ändert/Löscht ALLE Datensätze!
UPDATE users SET passwort = 'neu';
DELETE FROM users;

-- ✅ Sicher mit WHERE
UPDATE users SET passwort = 'neu' WHERE user_id = 1;
DELETE FROM users WHERE user_id = 1;

Zusammenfassung

In diesem Kapitel hast du gelernt:

  • ✅ Daten mit INSERT einzufügen (einzeln und mehrfach)
  • ✅ Daten mit UPDATE zu ändern (immer mit WHERE!)
  • ✅ Daten mit DELETE zu löschen (immer mit WHERE!)
  • ✅ Den Unterschied zwischen DELETE und TRUNCATE
  • ✅ Häufige Anfängerfehler zu vermeiden

Übungen

  1. Praxis: Erstelle eine Tabelle products mit Feldern produkt_id, produkt_name, preis, bestand
  2. INSERT: Füge 5 Produkte in die Tabelle ein
  3. UPDATE: Erhöhe den Preis aller Produkte um 10%
  4. UPDATE: Setze den Bestand von Produkt 1 auf 0
  5. DELETE: Lösche alle Produkte mit Bestand 0

Nächstes Kapitel

Im nächsten Kapitel lernen wir DQL (Data Query Language) - wie man Daten aus Tabellen abfragt (SELECT). Das ist das Wichtigste und am häufigsten verwendete SQL!

Frei für alle Anfänger