In der letzten Vorlesung haben wir besprochen, welche Arten von JOIN es in SQL gibt. Heute schauen wir uns INNER JOIN genauer an.
INNER JOIN ist eine Art, Daten in relationalen Datenbanken zu verbinden. Damit kannst du Zeilen aus zwei Tabellen nehmen und nur die Zeilen zurückgeben, die laut deiner angegebenen Bedingung "übereinstimmen". Das heißt, INNER JOIN gibt nur die Schnittmenge der beiden Tabellen zurück und ignoriert alles andere.
Stell dir vor, du hast zwei Kisten. In einer liegen Karten mit Studenten, in der anderen Karten mit Kursen, für die sich Studenten angemeldet haben. Du willst wissen, welche Studenten in welchen Kursen eingeschrieben sind. Wenn es keine Übereinstimmung gibt (zum Beispiel, ein Student ist nirgends eingeschrieben), interessieren uns diese Daten erstmal nicht. Genau für so ein Szenario ist INNER JOIN perfekt.
Syntax von INNER JOIN
Die Syntax ist ziemlich direkt – du gibst die zwei Tabellen an, die du verbinden willst, und legst die Join-Bedingung mit dem Schlüsselwort ON fest.
SELECT spalten
FROM tabelle1 INNER JOIN tabelle2
ON tabelle1.feld = tabelle2.feld;
tabelle1undtabelle2– das sind die Tabellen, die du verbinden willst.feld– das sind die Spalten, nach denen abgeglichen wird.- Die Bedingung nach
ONgibt die Regeln an, wie die Zeilen aus beiden Tabellen gematcht werden.
Beispiele für die Verwendung von INNER JOIN
Für die nächsten Beispiele arbeiten wir mit zwei Tabellen:
Tabelle students – Daten über Studenten
| student_id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Anna | 22 |
| 3 | Peter | 19 |
| 4 | Dia | 21 |
Tabelle enrollments – Daten über Kursanmeldungen
| enrollment_id | student_id | course_id |
|---|---|---|
| 101 | 1 | 501 |
| 102 | 2 | 502 |
| 103 | 2 | 503 |
| 104 | 3 | 504 |
Beachte, dass Studentin Dia (mit student_id = 4) in keinem Kurs eingeschrieben ist.
Beispiel 1: Studenten und ihre Kurse abfragen
Wir wollen wissen, welche Studenten in welchen Kursen eingeschrieben sind. Das ist ein typischer Fall für INNER JOIN. Uns interessieren nur die Daten, wo es eine Übereinstimmung zwischen den Tabellen students und enrollments auf Basis von student_id gibt.
SELECT students.name, enrollments.course_id
FROM students INNER JOIN enrollments
ON students.student_id = enrollments.student_id;
Ergebnis:
| name | course_id |
|---|---|
| Otto | 501 |
| Anna | 502 |
| Anna | 503 |
| Peter | 504 |
Was sehen wir? INNER JOIN hat nur die Studenten zurückgegeben, die in Kursen eingeschrieben sind. Studentin Dia, die nirgends eingeschrieben ist, wurde nicht angezeigt.
Beispiel 2: Bestellungen und Kunden abfragen
Jetzt schauen wir uns ein anderes Beispiel an. Angenommen, wir haben die Tabellen orders (Bestellungen) und customers (Kunden). Wir wollen eine Liste aller Bestellungen mit den Namen der Kunden bekommen.
Tabelle orders
| order_id | customer_id | amount |
|---|---|---|
| 1 | 101 | 500 |
| 2 | 102 | 300 |
| 3 | 103 | 700 |
Tabelle customers
| customer_id | name |
|---|---|
| 101 | Otto |
| 102 | Anna |
| 104 | Peter |
Aufgabe: Wir müssen orders und customers nach customer_id verbinden, damit nur die Bestellungen zurückgegeben werden, für die es auch einen passenden Kunden gibt.
SELECT orders.order_id, customers.name, orders.amount
FROM orders INNER JOIN customers
ON orders.customer_id = customers.customer_id;
Ergebnis:
| order_id | name | amount |
|---|---|---|
| 1 | Otto | 500 |
| 2 | Anna | 300 |
Beachte, dass die Bestellung mit order_id = 3 nicht im Ergebnis ist, weil es keinen Kunden mit customer_id = 103 in der Tabelle customers gibt.
Wie INNER JOIN beim Verbinden von Tabellen hilft (und was schiefgehen kann)
INNER JOIN ist das Hauptwerkzeug, das du in fast jedem Projekt mit relationalen Datenbanken nutzen wirst. Es ist wie ein Schraubenschlüssel im Werkzeugkasten: Du kannst versuchen, ohne ihn auszukommen, aber es wird viel schwieriger. Zum Beispiel:
- Beim Erstellen von Reports, wo Daten aus mehreren Tabellen kombiniert werden müssen.
- Für Analysen, wenn Fakten mit Dimensionen verbunden werden sollen (zum Beispiel Verkäufe und Kunden).
- Für die Integration von Daten aus externen Systemen.
Der häufigste Fehler von Anfängern ist ein vergessenes ON oder eine falsch angegebene Join-Bedingung. Wenn du die richtige Bedingung nicht angibst, bekommst du statt des erwarteten Ergebnisses das kartesische Produkt der beiden Tabellen – das können Tausende oder Millionen von Zeilen sein, die keinen Sinn ergeben.
Beispiel für einen Fehler:
In diesem Beispiel fehlt die Join-Bedingung, deshalb erstellt die Abfrage jede mögliche Kombination von Zeilen aus beiden Tabellen (und das willst du wahrscheinlich nicht):
SELECT students.name, enrollments.course_id
FROM students, enrollments; -- FEHLER: keine Join-Bedingung!
Das Ergebnis sieht dann aus wie Chaos: Jede Zeile aus students wird mit jeder Zeile aus enrollments kombiniert.
GO TO FULL VERSION