Skip to content

Kapitel 5: DDL - Daten definieren

DDL (Data Definition Language) wird verwendet, um die Struktur der Datenbank zu definieren und zu ändern.

DDL-Befehle:
- CREATE   → Erstellen (Datenbank, Tabelle)
- ALTER    → Ändern (Tabelle)
- DROP     → Löschen (Datenbank, Tabelle)
- TRUNCATE → Tabelle leeren (Struktur bleibt erhalten)

5.1 Datenbank-Operationen

1. Datenbank erstellen (CREATE DATABASE)

sql
-- Basis-Syntax
CREATE DATABASE datenbank_name;

-- Mit Zeichensatz (empfohlen!)
CREATE DATABASE shop_db 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

-- Falls noch nicht vorhanden (Fehler vermeiden)
CREATE DATABASE IF NOT EXISTS shop_db;

Beispiel:

sql
CREATE DATABASE IF NOT EXISTS blog_db 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

2. Alle Datenbanken anzeigen (SHOW DATABASES)

sql
SHOW DATABASES;

Ausgabe:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| blog_db           |
| mysql             |
| performance_schema |
| shop_db           |
+--------------------+

3. Datenbank auswählen/wechseln (USE)

sql
-- Datenbank verwenden
USE shop_db;

-- Aktuelle Datenbank anzeigen
SELECT DATABASE();

4. Datenbank löschen (DROP DATABASE) ⚠️ Vorsicht!

sql
-- Datenbank löschen (Kann nicht rückgängig gemacht werden!)
DROP DATABASE shop_db;

-- Sicherer (Fehler wird vermieden, falls Datenbank nicht existiert)
DROP DATABASE IF EXISTS shop_db;

⚠️ WARNUNG: DROP DATABASE löscht ALLES unwiderruflich!

5. Datenbank-Encoding ändern (ALTER DATABASE)

sql
ALTER DATABASE shop_db 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

5.2 Tabellen-Operationen

1. Tabelle erstellen (CREATE TABLE) ⭐ Wichtig!

sql
-- Basis-Syntax
CREATE TABLE tabellen_name (
    feld1 datentyp [constraint],
    feld2 datentyp [constraint],
    ...
    [tabellen_constraint]
) [optionen];

Vollständiges Beispiel:

sql
CREATE TABLE users (
    -- Feld: user_id, Typ: INT, Primaerschluessel, auto-Inkrement
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    
    -- Feld: username, Typ: VARCHAR(50), darf nicht NULL sein, muss eindeutig sein
    username VARCHAR(50) NOT NULL UNIQUE,
    
    -- Feld: email, Typ: VARCHAR(100), darf nicht NULL sein
    email VARCHAR(100) NOT NULL,
    
    -- Feld: passwort, Typ: VARCHAR(255)
    passwort VARCHAR(255) NOT NULL,
    
    -- Feld: erstellt_am, Typ: DATETIME, Standard: aktuelle Zeit
    erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP,
    
    -- Feld: ist_aktiv, Typ: BOOLEAN, Standard: TRUE
    ist_aktiv BOOLEAN DEFAULT TRUE
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

2. Alle Tabellen anzeigen (SHOW TABLES)

sql
USE shop_db;
SHOW TABLES;

Ausgabe:

+-------------------+
| Tables_in_shop_db |
+-------------------+
| users             |
| products          |
+-------------------+

3. Tabellenstruktur anzeigen (DESC / DESCRIBE)

sql
DESC users;
-- oder
DESCRIBE users;

Ausgabe:

+---------------+--------------+------+-----+-------------------+-------+
| Field         | Type         | Null | Key | Default           | Extra |
+---------------+--------------+------+-----+-------------------+-------+
| user_id       | int          | NO   | PRI | NULL              | auto_ |
| username      | varchar(50)  | NO   | UNI | NULL              |       |
| email         | varchar(100) | NO   |     | NULL              |       |
| passwort      | varchar(255) | NO   |     | NULL              |       |
| erstellt_am   | datetime     | YES  |     | CURRENT_TIMESTAMP |       |
| ist_aktiv     | tinyint(1)  | YES  |     | 1                 |       |
+---------------+--------------+------+-----+-------------------+-------+

4. Tabelle löschen (DROP TABLE) ⚠️ Vorsicht!

sql
-- Tabelle löschen
DROP TABLE users;

-- Sicherer
DROP TABLE IF EXISTS users;

⚠️ WARNUNG: DROP TABLE löscht die Tabelle und ALLE Daten!

5. Tabelle leeren (TRUNCATE TABLE)

sql
-- Alle Daten löschen, Struktur bleibt erhalten
TRUNCATE TABLE users;

Unterschied: DELETE vs TRUNCATE

DELETE FROM users;      → Löscht Zeile für Zeile (langsam, kann rückgängig gemacht werden)
TRUNCATE TABLE users;  → Löscht alle Daten sofort (schnell, kann NICHT rückgängig gemacht werden)

5.3 Tabellen-Constraints (Wichtig für Datenintegrität)

Constraints stellen sicher, dass die Daten korrekt und konsistent sind.

1. PRIMARY KEY (Primärschlüssel) ⭐

sql
-- Methode 1: In der Felddefinition
CREATE TABLE users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    ...
);

-- Methode 2: Am Ende der CREATE TABLE (für zusammengesetzte Schlüssel)
CREATE TABLE bestellungen (
    bestell_id INT,
    produkt_id INT,
    menge INT,
    PRIMARY KEY (bestell_id, produkt_id)
);

Regeln:

  • Jede Tabelle sollte einen Primärschlüssel haben
  • Der Wert muss eindeutig sein
  • Darf nicht NULL sein

2. NOT NULL (Nicht-NULL-Constraint)

sql
CREATE TABLE users (
    username VARCHAR(50) NOT NULL,  -- Muss ausgefüllt werden
    email VARCHAR(100)              -- Darf leer sein (NULL)
);

3. UNIQUE (Eindeutigkeits-Constraint)

sql
CREATE TABLE users (
    email VARCHAR(100) UNIQUE  -- Keine zwei Benutzer dürfen dieselbe E-Mail haben
);

4. DEFAULT (Standardwert)

sql
CREATE TABLE users (
    erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP,
    status VARCHAR(20) DEFAULT 'aktiv'
);

5. AUTO_INCREMENT (Automatische Inkrementierung)

sql
CREATE TABLE users (
    user_id INT PRIMARY KEY AUTO_INCREMENT  -- 1, 2, 3, ...
);

5.4 Tabelle ändern (ALTER TABLE)

1. Tabellennamen ändern

sql
ALTER TABLE users RENAME TO members;
-- oder
RENAME TABLE users TO members;

2. Feld hinzufügen (ADD COLUMN)

sql
-- Feld am Ende hinzufügen
ALTER TABLE users ADD COLUMN telefon VARCHAR(20);

-- Feld an bestimmter Position hinzufügen
ALTER TABLE users ADD COLUMN telefon VARCHAR(20) AFTER email;
ALTER TABLE users ADD COLUMN telefon VARCHAR(20) FIRST;

3. Feld-Typ ändern (MODIFY COLUMN)

sql
-- VARCHAR(50) in VARCHAR(100) ändern
ALTER TABLE users MODIFY COLUMN username VARCHAR(100);

4. Feld-Namen und Typ ändern (CHANGE COLUMN)

sql
-- Feld "telefon" in "handy" umbenennen und Typ ändern
ALTER TABLE users CHANGE COLUMN telefon handynr VARCHAR(30);

5. Feld löschen (DROP COLUMN)

sql
ALTER TABLE users DROP COLUMN handynr;

5.5 Praxisbeispiel: Datenbank und Tabellen erstellen

Szenario: Erstelle eine Datenbank für einen Online-Shop.

Schritt 1: Datenbank erstellen

sql
CREATE DATABASE IF NOT EXISTS shop_db 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

USE shop_db;

Schritt 2: Tabelle "categories" (Kategorien) erstellen

sql
CREATE TABLE categories (
    kategorie_id INT PRIMARY KEY AUTO_INCREMENT,
    kategorie_name VARCHAR(50) NOT NULL UNIQUE,
    beschreibung TEXT,
    erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Schritt 3: Tabelle "products" (Produkte) erstellen

sql
CREATE TABLE products (
    produkt_id INT PRIMARY KEY AUTO_INCREMENT,
    produkt_name VARCHAR(200) NOT NULL,
    kategorie_id INT,
    preis DECIMAL(10,2) NOT NULL,
    bestand INT DEFAULT 0,
    beschreibung TEXT,
    erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP,
    
    -- Foreign Key Constraint (später lernen)
    FOREIGN KEY (kategorie_id) REFERENCES categories(kategorie_id)
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Schritt 4: Tabellenstruktur überprüfen

sql
DESC categories;
DESC products;

Schritt 5: Tabelle ändern (neue Felder hinzufügen)

sql
-- Bild-URL hinzufügen
ALTER TABLE products ADD COLUMN bild_url VARCHAR(500) AFTER beschreibung;

-- Rabatt-Feld hinzufügen
ALTER TABLE products ADD COLUMN rabatt_prozent DECIMAL(5,2) DEFAULT 0.00;

Häufige Fehler für Einsteiger

Fehler 1: Constraints falsch verwendet

sql
-- ❌ Falsch: PRIMARY KEY vergessen
CREATE TABLE users (
    username VARCHAR(50)
);

-- ✅ Richtig
CREATE TABLE users (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL
);

Fehler 2: Felder falsch formatiert

sql
-- ❌ Falsch: Komma fehlt
CREATE TABLE users (
    id INT PRIMARY KEY
    name VARCHAR(50)  -- Hier fehlt das Komma!
);

-- ✅ Richtig
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

Fehler 3: DROP ohne WHERE (Datenverlust!)

sql
-- ❌ GEFÄHRLICH: Löscht ALLES!
DROP TABLE users;

-- ✅ Sicherer: Erst prüfen
SHOW TABLES LIKE 'users';
-- Dann erst löschen, wenn sicher

Zusammenfassung

In diesem Kapitel hast du gelernt:

  • ✅ Datenbanken zu erstellen, anzuzeigen und zu löschen
  • ✅ Tabellen zu erstellen mit verschiedenen Datentypen
  • ✅ Constraints (PRIMARY KEY, NOT NULL, UNIQUE, DEFAULT)
  • ✅ Tabellen zu ändern (ALTER TABLE)
  • ✅ Tabellen zu löschen (DROP TABLE, TRUNCATE TABLE)

Übungen

  1. Praxis: Erstelle eine Datenbank university_db
  2. Praxis: Erstelle eine Tabelle students mit folgenden Feldern:
    • student_id (INT, Primaerschluessel, auto-Inkrement)
    • matrikel_nr (VARCHAR(20), eindeutig, nicht NULL)
    • vorname (VARCHAR(50), nicht NULL)
    • nachname (VARCHAR(50), nicht NULL)
    • email (VARCHAR(100), eindeutig)
    • eingeschrieben_am (DATE)
  3. Praxis: Füge ein Feld durchschnittsnote (DECIMAL(3,2)) zur Tabelle students hinzu
  4. Praxis: Ändere den Datentyp von matrikel_nr zu VARCHAR(30)

Nächstes Kapitel

Im nächsten Kapitel lernen wir DML (Data Manipulation Language) - wie man Daten in Tabellen einfügt, ändert und löscht.

Frei für alle Anfänger