Appearance
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 sicherZusammenfassung
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
- Praxis: Erstelle eine Datenbank
university_db - Praxis: Erstelle eine Tabelle
studentsmit 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)
- Praxis: Füge ein Feld
durchschnittsnote(DECIMAL(3,2)) zur Tabellestudentshinzu - Praxis: Ändere den Datentyp von
matrikel_nrzu 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.
