🗄️ Datenbanken verstehen
Das Herz jeder dynamischen Webseite – Daten speichern, verwalten und abfragen
Von den Grundlagen bis zu komplexen Datenmodellen
🛠️ Empfohlene Tools für Entwickler
Diese Tools nutze ich selbst – sie helfen Ihnen, Ihre Projekte professionell umzusetzen und zu vermarkten.
🔒 XLS Padlock
Excel-Arbeitsmappen als EXE kompilieren und schützen – perfekt für Datenbank-gestützte Excel-Lösungen.
Jetzt ansehen →🐍 VBA Padlock
VBA-Code kompilieren und Office-Lösungen verkaufen – ohne Source-Code-Weitergabe.
Jetzt ansehen →📦 Paquet Builder
Professionelle Windows-Installationsprogramme für Ihre Anwendungen erstellen.
Jetzt ansehen →⚡ ExeOutput for PHP
PHP-Anwendungen in eigenständige Windows-EXE-Dateien kompilieren.
Jetzt ansehen →📄 HTML Executable
HTML-Dateien und Websites als eigenständige Windows-EXE-Dateien kompilieren.
Jetzt ansehen →* Affiliate-Links: Bei einem Kauf über diese Links erhalten wir eine kleine Provision – für Sie entstehen keine zusätzlichen Kosten.
1. Was ist eine Datenbank?
Eine Datenbank ist ein strukturierter Speicher für Informationen. Stellen Sie sich eine Datenbank wie eine digitale Excel-Tabelle vor, die aber viel größer, schneller und sicherer ist.
📊 So sieht eine Datenbank-Tabelle aus
| ID | Name | Stadt | Alter |
|---|---|---|---|
| 1 | Anna Müller | Berlin | 28 |
| 2 | Ben Schmidt | München | 34 |
| 3 | Clara Wagner | Berlin | 22 |
| 4 | David Fischer | Hamburg | 41 |
| 5 | Elena Weber | Berlin | 19 |
🔑 Die 5 wichtigsten Eigenschaften einer Datenbank
- Strukturiert: Daten sind in Tabellen organisiert (Zeilen & Spalten)
- Persistent: Daten bleiben dauerhaft gespeichert
- Sicher: Nur autorisierte Benutzer können darauf zugreifen
- Schnell: Milliarden von Datensätzen können in Sekunden durchsucht werden
- Transaktionssicher: Änderungen können rückgängig gemacht werden (ACID)
2. Arten von Datenbanken
📊 Relationale Datenbanken (SQL)
Relationale Datenbanken sind die am häufigsten verwendeten Datenbanken. Sie speichern Daten in Tabellen, die miteinander verknüpft werden können.
- Beispiele: MySQL, PostgreSQL, SQLite, Oracle, Microsoft SQL Server
- Sprache: SQL (Structured Query Language)
- Vorteile: Strukturiert, sicher, ACID-konform, standardisiert
- Nachteile: Weniger flexibel für unstrukturierte Daten
📦 NoSQL-Datenbanken
NoSQL-Datenbanken sind für unstrukturierte oder flexible Daten gedacht. Sie sind besonders skalierbar.
- Beispiele: MongoDB (Dokumente), Redis (Key-Value), Cassandra (Spalten), Neo4j (Graph)
- Vorteile: Flexibel, horizontal skalierbar, schnell für bestimmte Anwendungen
- Nachteile: Weniger standardisiert, keine ACID-Garantien
| Merkmal | SQL (Relational) | NoSQL |
|---|---|---|
| Struktur | Tabellen mit festem Schema | Flexible Struktur (JSON, Key-Value, Graph) |
| Sprache | SQL | Eigene Abfragesprachen |
| Skalierung | Vertikal (stärkere Hardware) | Horizontal (mehr Server) |
| ACID | Ja | Meist nicht |
| Beispiele | MySQL, PostgreSQL | MongoDB, Redis |
🎯 Live-Demo: DBMS-Vergleich
Klicke auf einen Button, um mehr über ein DBMS zu erfahren:
3. Tabellen & Beziehungen
In einer relationalen Datenbank bestehen die Daten aus Tabellen. Eine Tabelle hat Spalten (Felder) und Zeilen (Datensätze).
📋 Beispiel: Zwei verknüpfte Tabellen
👤 Tabelle: Kunden
| KundenID | Vorname | Nachname | Stadt |
|---|---|---|---|
| 1 | Anna | Müller | Berlin |
| 2 | Ben | Schmidt | München |
| 3 | Clara | Wagner | Berlin |
📦 Tabelle: Bestellungen
| BestellID | KundenID | Produkt | Preis |
|---|---|---|---|
| 1 | 1 | Laptop | 899.00 |
| 2 | 2 | Maus | 24.99 |
| 3 | 1 | Tastatur | 49.90 |
| 4 | 3 | Monitor | 199.00 |
🔗 Beziehungen zwischen Tabellen
- 1:1 (Eins-zu-Eins): Ein Kunde hat genau eine Adresse
- 1:N (Eins-zu-Viele): Ein Kunde hat viele Bestellungen
- N:M (Viele-zu-Viele): Produkte haben viele Kategorien und Kategorien haben viele Produkte
4. Primär- & Fremdschlüssel
🔑 Primärschlüssel (Primary Key)
Ein Primärschlüssel ist eine eindeutige ID für jeden Datensatz in einer Tabelle.
- Jeder Datensatz hat einen eindeutigen Primärschlüssel
- Er darf nie leer sein (NOT NULL)
- Oft wird eine automatisch hochzählende Zahl verwendet (AUTO_INCREMENT)
- Beispiel:
KundenIDin der Kunden-Tabelle
🔗 Fremdschlüssel (Foreign Key)
Ein Fremdschlüssel verbindet zwei Tabellen miteinander. Er verweist auf den Primärschlüssel einer anderen Tabelle.
- Er stellt die Beziehung zwischen Tabellen her
- Er stellt sicher, dass die Datenintegrität erhalten bleibt
- Beispiel:
KundenIDin der Bestellungen-Tabelle
📊 Beispiel: Primär- und Fremdschlüssel
KundenID (Primärschlüssel) | Vorname | Nachname
1 | Anna | Müller
2 | Ben | Schmidt
3 | Clara | Wagner
Bestellungen
BestellID | KundenID (Fremdschlüssel) | Produkt | Preis
1 | 1 | Laptop | 899.00
2 | 2 | Maus | 24.99
3 | 1 | Tastatur | 49.90
4 | 3 | Monitor | 199.00
🔵 KundenID = Primärschlüssel
🔴 KundenID = Fremdschlüssel (verweist auf Kunden)
5. SQL-Grundlagen
SQL (Structured Query Language) ist die Standardsprache für relationale Datenbanken.
📝 Die 5 wichtigsten SQL-Befehle
| Befehl | Bedeutung | Beispiel |
|---|---|---|
| SELECT | Daten abfragen | SELECT * FROM Kunden; |
| INSERT | Daten einfügen | INSERT INTO Kunden (Name) VALUES ('Anna'); |
| UPDATE | Daten ändern | UPDATE Kunden SET Stadt = 'Berlin' WHERE ID = 1; |
| DELETE | Daten löschen | DELETE FROM Kunden WHERE ID = 5; |
| CREATE | Tabellen erstellen | CREATE TABLE Kunden (ID INT, Name VARCHAR(100)); |
-- Tabelle "Kunden" erstellen CREATE TABLE Kunden ( KundenID INT PRIMARY KEY AUTO_INCREMENT, Vorname VARCHAR(50) NOT NULL, Nachname VARCHAR(50) NOT NULL, Stadt VARCHAR(50), Alter INT );
6. SELECT – Daten abfragen
-- Alle Daten abfragen SELECT * FROM Kunden; -- Nur bestimmte Spalten SELECT Vorname, Nachname FROM Kunden; -- Mit Bedingung (WHERE) SELECT * FROM Kunden WHERE Stadt = 'Berlin'; -- Mit Sortierung SELECT * FROM Kunden ORDER BY Nachname ASC; -- Mit Limit (nur die ersten 5) SELECT * FROM Kunden LIMIT 5;
🎯 Live-Demo: Datenbank abfragen
Simulierte Datenbank mit Kunden:
7. INSERT, UPDATE, DELETE
📝 INSERT – Daten einfügen
-- Einen neuen Kunden einfügen INSERT INTO Kunden (Vorname, Nachname, Stadt, Alter) VALUES ('Felix', 'Klein', 'Köln', 27); -- Mehrere Datensätze auf einmal INSERT INTO Kunden (Vorname, Nachname, Stadt, Alter) VALUES ('Greta', 'Bauer', 'Leipzig', 26), ('Hanna', 'Schulz', 'Dresden', 31);
📝 UPDATE – Daten ändern
-- Die Stadt eines Kunden ändern UPDATE Kunden SET Stadt = 'Frankfurt' WHERE KundenID = 6; -- Mehrere Felder ändern UPDATE Kunden SET Stadt = 'Düsseldorf', Alter = 30 WHERE KundenID = 6;
📝 DELETE – Daten löschen
-- Einen Kunden löschen DELETE FROM Kunden WHERE KundenID = 6; -- Achtung: Ohne WHERE werden ALLE Datensätze gelöscht! DELETE FROM Kunden; -- Leert die ganze Tabelle!
UPDATE und DELETE immer
WHERE verwenden – sonst werden alle Datensätze geändert/gelöscht!
8. Verknüpfungen (JOIN)
Mit JOIN verbinden Sie Daten aus mehreren Tabellen.
-- Kunden mit ihren Bestellungen SELECT Kunden.Vorname, Kunden.Nachname, Bestellungen.Produkt, Bestellungen.Preis FROM Kunden JOIN Bestellungen ON Kunden.KundenID = Bestellungen.KundenID; -- Mit Aliase (kurze Schreibweise) SELECT k.Vorname, k.Nachname, b.Produkt, b.Preis FROM Kunden AS k JOIN Bestellungen AS b ON k.KundenID = b.KundenID;
🎯 Live-Demo: JOIN in Aktion
Zeige Kunden mit ihren Bestellungen:
9. Aggregatfunktionen
Aggregatfunktionen führen Berechnungen auf Daten durch.
| Funktion | Beschreibung | Beispiel |
|---|---|---|
COUNT(*) |
Zählt die Zeilen | SELECT COUNT(*) FROM Kunden; → 5 |
SUM(Spalte) |
Summiert die Werte | SELECT SUM(Alter) FROM Kunden; → 144 |
AVG(Spalte) |
Durchschnitt | SELECT AVG(Alter) FROM Kunden; → 28.8 |
MIN(Spalte) |
Kleinster Wert | SELECT MIN(Alter) FROM Kunden; → 19 |
MAX(Spalte) |
Größter Wert | SELECT MAX(Alter) FROM Kunden; → 41 |
-- Anzahl der Kunden pro Stadt SELECT Stadt, COUNT(*) AS Anzahl FROM Kunden GROUP BY Stadt; -- Durchschnittsalter pro Stadt SELECT Stadt, AVG(Alter) AS Durchschnittsalter FROM Kunden GROUP BY Stadt;
🎯 Live-Demo: Aggregatfunktionen
10. Indizes & Performance
Indizes sind wie das Register eines Buches – sie machen die Suche in der Datenbank viel schneller.
📝 Index erstellen
-- Einen Index auf die Spalte "Stadt" erstellen CREATE INDEX idx_stadt ON Kunden (Stadt); -- Einen eindeutigen Index (keine Duplikate erlaubt) CREATE UNIQUE INDEX idx_email ON Kunden (Email);
🚀 Tipps für bessere Performance
- Indizes auf häufig abgefragte Spalten
- Nur benötigte Spalten abfragen (
SELECT *vermeiden) - WHERE mit indizierten Spalten verwenden
- JOINs auf indizierte Fremdschlüssel
- LIMIT für große Ergebnismengen
- Datenbank-Normalisierung (Daten nicht doppelt speichern)
11. Datenbank-Design
Ein gutes Datenbank-Design ist die Grundlage für jede erfolgreiche Anwendung.
📐 Normalisierung (Daten nicht doppelt speichern)
❌ Schlecht (Redundanz):
1 | Anna | Berlin | Laptop
2 | Anna | Berlin | Tastatur
✅ Gut (Normalisiert):
1 | Anna | Berlin
Bestellungen: BestellID | KundenID | Produkt
1 | 1 | Laptop
2 | 1 | Tastatur
📝 Best Practices für Datenbank-Design
- Eindeutige IDs (Primärschlüssel) für jede Tabelle
- Nicht doppelt speichern – Daten normalisieren
- Aussagekräftige Namen für Tabellen und Spalten
- Fremdschlüssel für alle Beziehungen
- NOT NULL für Pflichtfelder
- Datentypen passend wählen (VARCHAR, INT, DATE, etc.)
12. ACID – Transaktionssicherheit
ACID ist ein Akronym für die vier Eigenschaften, die eine sichere und zuverlässige Datenbank-Transaktion ausmachen.
📝 Beispiel: Banküberweisung (ACID in Aktion)
-- Beispiel: 100€ von Konto A nach Konto B überweisen BEGIN TRANSACTION; -- Schritt 1: Geld von Konto A abziehen (Atomicity) UPDATE Konten SET Saldo = Saldo - 100 WHERE KontoID = 1; -- Schritt 2: Geld auf Konto B hinzufügen (Atomicity) UPDATE Konten SET Saldo = Saldo + 100 WHERE KontoID = 2; -- Schritt 3: Prüfen, ob alle Regeln eingehalten wurden (Consistency) -- (z.B. Saldo darf nicht negativ sein) -- Schritt 4: Transaktion abschließen (Durability) COMMIT;
Wenn ein Schritt fehlschlägt, macht ROLLBACK alle Änderungen rückgängig – die Datenbank bleibt konsistent.
🎯 Live-Demo: ACID verstehen
Simulierte Überweisung mit ACID-Eigenschaften:
13. Datenbank-Sicherheit
Die Sicherheit Ihrer Datenbank ist entscheidend für den Schutz Ihrer Daten vor unbefugtem Zugriff und Angriffen.
🔒 Wichtige Sicherheitsmaßnahmen
- Starke Passwörter: Verwenden Sie lange, komplexe Passwörter für Datenbank-Benutzer
- Prinzip der geringsten Rechte: Jeder Benutzer hat nur die notwendigen Rechte
- SQL-Injection-Schutz: Verwenden Sie Prepared Statements
- Datenbank-Firewall: Blockieren Sie unerwünschte Zugriffe
- Verschlüsselung: Verschlüsseln Sie sensible Daten (z.B. Passwörter, Kreditkarten)
- Regelmäßige Backups: Sichern Sie Ihre Datenbank regelmäßig
- Updates: Halten Sie Ihre Datenbank-Software aktuell
- Audit-Logs: Protokollieren Sie alle Änderungen und Zugriffe
🛡️ Beispiel: Sichere Passwort-Speicherung
-- Passwörter niemals im Klartext speichern! -- Stattdessen: Passwort hashen und salzen -- INSERT mit gehashtem Passwort (z.B. mit bcrypt) INSERT INTO Benutzer (Benutzername, PasswortHash) VALUES ('admin', '$2y$10$...'); -- Beim Login: eingegebenes Passwort hashen und mit Datenbank vergleichen SELECT * FROM Benutzer WHERE Benutzername = 'admin' AND PasswortHash = '$2y$10$...';
14. Praxis-Beispiele
📝 Beispiel 1: Blog-Datenbank
-- Tabellen für einen einfachen Blog CREATE TABLE Benutzer ( BenutzerID INT PRIMARY KEY AUTO_INCREMENT, Benutzername VARCHAR(50) UNIQUE NOT NULL, Email VARCHAR(100) UNIQUE NOT NULL, PasswortHash VARCHAR(255) NOT NULL, ErstelltAm DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE Beiträge ( BeitragID INT PRIMARY KEY AUTO_INCREMENT, BenutzerID INT NOT NULL, Titel VARCHAR(200) NOT NULL, Inhalt TEXT NOT NULL, ErstelltAm DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (BenutzerID) REFERENCES Benutzer(BenutzerID) );
📝 Beispiel 2: E-Commerce-Datenbank
-- Tabellen für einen Online-Shop CREATE TABLE Produkte ( ProduktID INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(100) NOT NULL, Preis DECIMAL(10,2) NOT NULL, Lagerbestand INT DEFAULT 0 ); CREATE TABLE Bestellungen ( BestellID INT PRIMARY KEY AUTO_INCREMENT, KundenID INT NOT NULL, Bestelldatum DATETIME DEFAULT CURRENT_TIMESTAMP, Gesamtpreis DECIMAL(10,2) NOT NULL ); CREATE TABLE Bestellpositionen ( PositionID INT PRIMARY KEY AUTO_INCREMENT, BestellID INT NOT NULL, ProduktID INT NOT NULL, Menge INT NOT NULL, Preis DECIMAL(10,2) NOT NULL, FOREIGN KEY (BestellID) REFERENCES Bestellungen(BestellID), FOREIGN KEY (ProduktID) REFERENCES Produkte(ProduktID) );
📝 Beispiel 3: Wichtige SQL-Abfragen
-- Top 5 Kunden mit den meisten Bestellungen SELECT k.Vorname, k.Nachname, COUNT(b.BestellID) AS AnzahlBestellungen FROM Kunden k LEFT JOIN Bestellungen b ON k.KundenID = b.KundenID GROUP BY k.KundenID ORDER BY AnzahlBestellungen DESC LIMIT 5; -- Produkte, die nie bestellt wurden SELECT p.Name FROM Produkte p LEFT JOIN Bestellpositionen bp ON p.ProduktID = bp.ProduktID WHERE bp.PositionID IS NULL; -- Kunden mit ihrem Umsatz (Summe aller Bestellungen) SELECT k.Vorname, k.Nachname, SUM(b.Preis) AS Gesamtumsatz FROM Kunden k JOIN Bestellungen b ON k.KundenID = b.KundenID GROUP BY k.KundenID ORDER BY Gesamtumsatz DESC;
15. Übungen zum Mitmachen
📝 Übung 1: SELECT-Abfragen
Schreibe eine SQL-Abfrage, die alle Kunden aus Berlin anzeigt, sortiert nach Nachname.
SELECT * FROM Kunden WHERE Stadt = 'Berlin' ORDER BY Nachname ASC;
📝 Übung 2: INSERT
Füge einen neuen Kunden ein: "Mia", "Koch", "Hamburg", 25.
INSERT INTO Kunden (Vorname, Nachname, Stadt, Alter) VALUES ('Mia', 'Koch', 'Hamburg', 25);
📝 Übung 3: UPDATE
Ändere die Stadt von Kunde mit ID 3 auf "Leipzig".
UPDATE Kunden SET Stadt = 'Leipzig' WHERE KundenID = 3;
📝 Übung 4: Aggregatfunktion
Wie viele Kunden wohnen in Berlin?
SELECT COUNT(*) FROM Kunden WHERE Stadt = 'Berlin';
📝 Übung 5: JOIN
Zeige alle Kunden mit ihren Bestellungen (Vorname, Nachname, Produkt, Preis).
SELECT k.Vorname, k.Nachname, b.Produkt, b.Preis FROM Kunden k JOIN Bestellungen b ON k.KundenID = b.KundenID;
📝 Übung 6: ACID (Fortgeschritten)
Warum ist ACID wichtig für eine Banking-Datenbank?
ACID stellt sicher, dass eine Überweisung entweder komplett ausgeführt wird (Atomicity), die Datenbank konsistent bleibt (Consistency), gleichzeitige Transaktionen sich nicht beeinflussen (Isolation) und die Daten dauerhaft gespeichert werden (Durability).
16. Tipps & Best Practices
UPDATE und DELETE
immer WHERE verwenden – sonst werden alle Daten geändert!
WHERE und JOIN
sollten Indizes erstellt werden.
17. Weiterführende Ressourcen
📚 Online-Lernplattformen
- SQLZoo – Interaktive SQL-Übungen direkt im Browser
- W3Schools SQL – Schritt-für-Schritt-Anleitung mit Beispielen
- LeetCode SQL – SQL-Herausforderungen für Fortgeschrittene
- Khan Academy SQL – Kostenloser interaktiver Kurs
- Mode Analytics SQL Tutorial – Ausführliches SQL-Tutorial
📖 Empfohlene Bücher
- "SQL für Dummies" – Allen G. Taylor
- "SQL – Das umfassende Handbuch" – Thomas Theis
- "Learning SQL" – Alan Beaulieu
- "Datenbanken – Das umfassende Handbuch" – Andreas K. Schmid
🛠️ Kostenlose Übungs-Datenbanken
- SQLite – Einfache Datei-Datenbank zum Üben
- MySQL Community Edition – Kostenlose Datenbank für lokale Tests
- PostgreSQL – Leistungsstarke Open-Source-Datenbank
- DB Browser for SQLite – Grafische Oberfläche für SQLite
- DBeaver – Universeller Datenbank-Client