Appearance
Kapitel 9: Tabellenverbindungen (JOINs) ⭐⭐
Tabellenverbindungen werden verwendet, um Daten aus mehreren Tabellen gleichzeitig abzufragen.
9.1 Bedeutung von Tabellenverbindungen
In der Praxis sind Daten oft auf mehrere Tabellen verteilt:
Beispiel: Online-Shop
- Tabelle "users": Speichert Benutzerinformationen
- Tabelle "orders": Speichert Bestellungen
- Tabelle "products": Speichert Produktinformationen
Frage: Wie finde ich alle Bestellungen eines Benutzers?
Antwort: Tabellenverbindungen (JOINs) verwenden!9.2 INNER JOIN (Inner Join) ⭐⭐ Wichtig!
INNER JOIN gibt nur Datensätze zurück, die in beiden Tabellen übereinstimmen.
Syntax
sql
SELECT felder
FROM tabelle1
INNER JOIN tabelle2
ON tabelle1.feld = tabelle2.feld;Beispiel
Szenario: Benutzer und ihre Bestellungen abfragen.
sql
-- Testdaten erstellen
CREATE DATABASE IF NOT EXISTS shop_db;
USE shop_db;
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50)
);
CREATE TABLE orders (
bestell_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
produkt_name VARCHAR(200),
menge INT
);
INSERT INTO users (username) VALUES ('Max'), ('Lisa'), ('John');
INSERT INTO orders (user_id, produkt_name, menge)
VALUES (1, 'T-Shirt', 2), (1, 'Jeans', 1), (2, 'Sneaker', 1);INNER JOIN verwenden:
sql
SELECT
users.username,
orders.produkt_name,
orders.menge
FROM users
INNER JOIN orders
ON users.user_id = orders.user_id;Ergebnis:
+----------+----------------+-------+
| username | produkt_name | menge |
+----------+----------------+-------+
| Max | T-Shirt | 2 |
| Max | Jeans | 1 |
| Lisa | Sneaker | 1 |
+----------+----------------+-------+Erklärung:
Johnerscheint NICHT im Ergebnis, weil er keine Bestellungen hat- Nur Übereinstimmungen in beiden Tabellen werden angezeigt
9.3 LEFT JOIN (Left Join) ⭐⭐
LEFT JOIN gibt alle Datensätze der linken Tabelle und die übereinstimmenden Datensätze der rechten Tabelle zurück.
- Wenn keine Übereinstimmung in der rechten Tabelle gefunden wird →
NULL
Syntax
sql
SELECT felder
FROM tabelle1 -- Linke Tabelle
LEFT JOIN tabelle2 -- Rechte Tabelle
ON tabelle1.feld = tabelle2.feld;Beispiel
sql
SELECT
users.username,
orders.produkt_name,
orders.menge
FROM users
LEFT JOIN orders
ON users.user_id = orders.user_id;Ergebnis:
+----------+----------------+-------+
| username | produkt_name | menge |
+----------+----------------+-------+
| Max | T-Shirt | 2 |
| Max | Jeans | 1 |
| Lisa | Sneaker | 1 |
| John | NULL | NULL | ← John hat keine Bestellungen
+----------+----------------+-------+9.4 RIGHT JOIN (Right Join)
RIGHT JOIN gibt alle Datensätze der rechten Tabelle und die übereinstimmenden Datensätze der linken Tabelle zurück.
- Wenn keine Übereinstimmung in der linken Tabelle gefunden wird →
NULL
Syntax
sql
SELECT felder
FROM tabelle1 -- Linke Tabelle
RIGHT JOIN tabelle2 -- Rechte Tabelle
ON tabelle1.feld = tabelle2.feld;Beispiel
sql
SELECT
users.username,
orders.produkt_name,
orders.menge
FROM users
RIGHT JOIN orders
ON users.user_id = orders.user_id;Ergebnis:
+----------+----------------+-------+
| username | produkt_name | menge |
+----------+----------------+-------+
| Max | T-Shirt | 2 |
| Max | Jeans | 1 |
| Lisa | Sneaker | 1 |
+----------+----------------+-------+Hinweis: RIGHT JOIN wird seltener verwendet. Meistens kann man LEFT JOIN umdrehen.
9.5 Mehrfache Tabellenverbindungen (3+ Tabellen)
Man kann mehrere Tabellen gleichzeitig verbinden!
Beispiel: Benutzer → Bestellungen → Produkte
sql
-- Tabelle "products" erstellen
CREATE TABLE products (
produkt_id INT PRIMARY KEY AUTO_INCREMENT,
produkt_name VARCHAR(200),
preis DECIMAL(10,2)
);
-- Daten einfügen
INSERT INTO products (produkt_name, preis)
VALUES ('T-Shirt', 19.99), ('Jeans', 59.99), ('Sneaker', 89.99);
-- orders-Tabelle um produkt_id erweitern
ALTER TABLE orders ADD COLUMN produkt_id INT;
-- produkt_id aktualisieren
UPDATE orders SET produkt_id = 1 WHERE bestell_id = 1;
UPDATE orders SET produkt_id = 2 WHERE bestell_id = 2;
UPDATE orders SET produkt_id = 3 WHERE bestell_id = 3;3 Tabellen verbinden:
sql
SELECT
users.username,
products.produkt_name,
products.preis,
orders.menge
FROM users
INNER JOIN orders ON users.user_id = orders.user_id
INNER JOIN products ON orders.produkt_id = products.produkt_id;Ergebnis:
+----------+----------------+-------+-------+
| username | produkt_name | preis | menge |
+----------+----------------+-------+-------+
| Max | T-Shirt | 19.99 | 2 |
| Max | Jeans | 59.99 | 1 |
| Lisa | Sneaker | 89.99 | 1 |
+----------+----------------+-------+-------+9.6 Praxisbeispiel: Komplexe Abfragen
Szenario: Blog-Datenbank mit Benutzern, Artikeln und Kommentaren.
Schritt 1: Tabellen erstellen
sql
CREATE DATABASE IF NOT EXISTS blog_db;
USE blog_db;
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50)
);
CREATE TABLE posts (
post_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
titel VARCHAR(200),
inhalt TEXT
);
CREATE TABLE comments (
comment_id INT PRIMARY KEY AUTO_INCREMENT,
post_id INT,
user_id INT,
kommentar TEXT
);Schritt 2: Testdaten einfügen
sql
INSERT INTO users (username) VALUES ('Max'), ('Lisa'), ('John');
INSERT INTO posts (user_id, titel, inhalt)
VALUES
(1, 'Mein erster Post', 'Hallo Welt!'),
(1, 'Zweiter Post', 'Noch ein Test'),
(2, 'Lisa schreibt', 'Ein Artikel von Lisa');
INSERT INTO comments (post_id, user_id, kommentar)
VALUES
(1, 2, 'Toller Artikel!'),
(1, 3, 'Danke fürs Teilen'),
(2, 3, 'Interessant...');Schritt 3: Abfragen erstellen
1. Alle Artikel mit Autor-Namen anzeigen:
sql
SELECT
posts.titel,
users.username AS autor
FROM posts
INNER JOIN users ON posts.user_id = users.user_id;2. Alle Kommentare zu einem Artikel mit Autor-Namen:
sql
SELECT
posts.titel,
users.username AS kommentar_von,
comments.kommentar
FROM comments
INNER JOIN posts ON comments.post_id = posts.post_id
INNER JOIN users ON comments.user_id = users.user_id;Häufige Fehler für Einsteiger
Fehler 1: Verbindungsbedingung falsch
sql
-- ❌ Falsch: Verbindungsbedingung fehlt (Kartesisches Produkt!)
SELECT * FROM users INNER JOIN orders;
-- ✅ Richtig: ON-Bedingung angeben
SELECT * FROM users INNER JOIN orders ON users.user_id = orders.user_id;Fehler 2: Mehrere Tabellen - Feldname nicht eindeutig
sql
-- ❌ Falsch: user_id kommt in beiden Tabellen vor
SELECT user_id FROM users INNER JOIN orders ON ...; -- FEHLER!
-- ✅ Richtig: Tabellennamen voranstellen
SELECT users.user_id, orders.user_id FROM users INNER JOIN orders ON ...;Fehler 3: LEFT JOIN vs INNER JOIN verwechseln
sql
-- INNER JOIN: Zeigt nur Benutzer MIT Bestellungen
SELECT * FROM users INNER JOIN orders ON users.user_id = orders.user_id;
-- LEFT JOIN: Zeigt ALLE Benutzer (auch solche OHNE Bestellungen)
SELECT * FROM users LEFT JOIN orders ON users.user_id = orders.user_id;Zusammenfassung
In diesem Kapitel hast du gelernt:
- ✅ Warum Tabellenverbindungen notwendig sind
- ✅
INNER JOINzu verwenden (nur Übereinstimmungen) - ✅
LEFT JOINzu verwenden (alle linke + übereinstimmende rechte) - ✅
RIGHT JOINzu verwenden (alle rechte + übereinstimmende linke) - ✅ Mehrere Tabellen gleichzeitig zu verbinden
- ✅ Praxisbeispiele mit Blog-Datenbank
Übungen
- Theorie: Was ist der Unterschied zwischen
INNER JOINundLEFT JOIN? - Praxis: Erstelle Tabellen
studentsundgrades, verbinde sie mitINNER JOIN - Praxis: Verwende
LEFT JOIN, um alle Schüler anzuzeigen (auch solche ohne Noten) - Praxis: Verbinde 3 Tabellen:
users→orders→products
Nächstes Kapitel
Im nächsten Kapitel lernen wir Unterabfragen (Subqueries) - wie man eine Abfrage innerhalb einer anderen Abfrage verwendet!
