ON oder WHERE bei JOINs
Erkennen, wann eine Bedingung in ON statt in WHERE gehört und warum das für die Ergebnisse wichtig ist
ON oder WHERE bei JOINs ist eine kostenlose Coding Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Ein Prädikat kann an zwei Stellen stehen
Sobald Sie einen INNER JOIN schreiben können, folgt im Interview die präzisere Frage: Gehört diese Bedingung in ON oder in WHERE?
Bei einem INNER JOIN lautet die Antwort oft: „Für das Ergebnis spielt es keine Rolle.“ Sobald Sie jedoch zu einem Outer JOIN wechseln, ändert diese Entscheidung das Ergebnis vollständig. Interviewer stellen diese Frage genau deshalb, weil Anfänger aus Gewohnheit alles in WHERE schreiben.
Diese Lektion formuliert die Regel klar und eindeutig.
Was ON bewirkt
Die ON-Klausel definiert, wie Zeilen einander zugeordnet werden. Sie wird ausgeführt, während der JOIN aufgebaut wird, und entscheidet, welche Zeile aus der linken Tabelle zu welcher Zeile aus der rechten Tabelle passt.
Stellen Sie sich ON als Antwort auf die Frage vor: „Gehören diese beiden Zeilen zusammen?“
SELECT c.name, o.amount
FROM customers c
JOIN orders o
ON o.customer_id = c.id; -- pairing ruleWas WHERE bewirkt
Die WHERE-Klausel wird nach dem JOIN ausgeführt, wenn dieser die kombinierten Zeilen erzeugt hat. Sie filtert diese Ergebnismenge und entfernt Zeilen, die den Test nicht bestehen.
Stellen Sie sich WHERE als Antwort auf die Frage vor: „Nachdem ich die Zeilen verknüpft habe, welche davon möchte ich behalten?“
SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30; -- filter after pairingBei INNER JOINs liefern sie oft dasselbe Ergebnis
Bei einem INNER JOIN liefert ein zusätzlicher Filter dasselbe Ergebnis, unabhängig davon, ob Sie ihn in ON oder WHERE platzieren. Beide folgenden Abfragen geben nur Adas Bestellung über 50 $ und Bobs Bestellung über 99 $ zurück.
Da nicht zugeordnete Zeilen bei einem INNER JOIN bereits entfernt werden, ändert das Verschieben des Prädikats nicht, welche Zeilen erhalten bleiben.
-- predicate in ON
SELECT c.name, o.amount FROM customers c
JOIN orders o
ON o.customer_id = c.id AND o.amount > 30;
-- predicate in WHERE -- same result here
SELECT c.name, o.amount FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;Warum der Stil bei Join-Schlüsseln weiterhin ON bevorzugt
Auch wenn die Ergebnisse gleich sind, gilt als Konvention: Bedingungen für die Join-Beziehung gehören in ON und fachliche Filter in WHERE.
- ON:
o.customer_id = c.id(wie die Tabellen miteinander in Beziehung stehen) - WHERE:
o.amount > 30(welche Ergebnisse Sie möchten)
Durch diese Trennung wird die Absicht für die nächste lesende Person und für den Interviewer, der Ihren Stil bewertet, sofort verständlich.
Wo es wirklich darauf ankommt: Outer JOINs
Bei einem LEFT JOIN wird der Unterschied entscheidend. Ein LEFT JOIN behält jede Zeile der linken Tabelle, auch wenn keine Zeile der rechten Tabelle passt. Sehen wir uns zunächst kurz customers und orders an, wobei Cleo keine Bestellungen hat.
Ein LEFT JOIN behält Cleo mit NULL-Werten in den Spalten von orders. Sehen Sie nun, was ON im Gegensatz zu WHERE mit ihrer Zeile macht.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- keeps Ada, Bob, AND Cleo (NULL amount)Filter in ON: Zeilen bleiben erhalten
Platzieren Sie die Bedingung amount > 30 in ON eines LEFT JOINs, beeinflusst sie nur, welche Zeilen der rechten Tabelle angehängt werden. Nicht zugeordnete Zeilen der linken Tabelle bleiben trotzdem erhalten, lediglich mit NULL-Werten.
Cleo bleibt erhalten. Jede Bestellung, die den Test nicht besteht, wird einfach nicht angehängt, sodass NULL stehen bleibt.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id AND o.amount > 30;
-- Ada 50, Bob 99, Cleo NULL (3 rows, Cleo kept)Filter in WHERE: Der Outer JOIN wird zum INNER JOIN
Verschieben Sie dieselbe Bedingung nach WHERE, filtern Sie das verknüpfte Ergebnis. Cleos Zeile enthält amount = NULL, und NULL > 30 ist nicht wahr, daher wird sie entfernt.
Der LEFT JOIN verhält sich stillschweigend wie ein INNER JOIN. Das ist die wohl bekannteste JOIN-Falle in Interviews.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;
-- Ada 50, Bob 99 (Cleo GONE -> back to inner-join behavior)Die Regel zum Merken
Formulieren Sie es im Interview klar und präzise:
- Eine Bedingung in ON entscheidet, ob die rechte Zeile angehängt wird; Zeilen der linken Tabelle bleiben erhalten.
- Eine Bedingung in WHERE filtert die endgültigen Zeilen und kann erhaltene Zeilen der linken Tabelle entfernen, wenn sie eine möglicherweise NULL-haltige Spalte betrifft.
Für Outer JOINs gilt daher: Prädikate für die optionale Tabelle gehören in ON, sofern Sie nicht ausdrücklich nicht zugeordnete Zeilen entfernen möchten.
Der legitime Einsatz von WHERE mit NULL
Es gibt einen Fall, in dem das Filtern einer Spalte aus einem Outer JOIN in WHERE genau richtig ist: den Anti-Join. Mit IS NULL finden Sie linke Zeilen, für die keine Übereinstimmung vorlag.
Hier behält WHERE absichtlich nur die nicht zugeordneten Zeilen und gibt Kunden ohne Bestellungen zurück. Die Mechanik ist dieselbe, die Absicht jedoch entgegengesetzt.
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL; -- customers with no orders -> CleoSchneller Denktest
Gehen Sie diese Checkliste durch, bevor Sie die Aufgabe lösen, wenn Sie eine JOIN-Bedingung sehen:
- Handelt es sich um einen Join-Schlüssel, der die Tabellen miteinander verbindet? -> ON.
- Handelt es sich um einen Filter für die erforderliche Tabelle? -> WHERE oder ON sind beide möglich.
- Handelt es sich um einen Filter für die optionale (äußere) Tabelle, wobei nicht zugeordnete Zeilen erhalten bleiben sollen? -> ON.
- Möchten Sie nicht zugeordnete Zeilen finden? -> WHERE ... IS NULL.
Schnelltest
Wenden Sie die ON-vs.-WHERE-Regel auf einen Outer JOIN an.
Zusammenfassung: ON vs. WHERE
Diese Punkte sollten Sie ins Interview mitnehmen:
- ON steuert die Zuordnung und entscheidet bei Outer JOINs, ob die optionale Zeile angehängt wird, während die beibehaltene Seite erhalten bleibt.
- WHERE filtert das bereits verknüpfte Ergebnis und kann erhaltene Zeilen entfernen.
- Bei einem INNER JOIN sind beide Klauseln oft austauschbar; bei Outer JOINs sind sie es nicht.
- Filter für die äußere Tabelle gehören in ON, sofern Sie nicht mit
IS NULLin WHERE absichtlich einen Anti-Join bilden möchten.
Häufig gestellte Fragen
Ist die Lektion „ON oder WHERE bei JOINs“ kostenlos?
Ja — der vollständige Text von „ON oder WHERE bei JOINs“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Coding Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „ON oder WHERE bei JOINs“?
Erkennen, wann eine Bedingung in ON statt in WHERE gehört und warum das für die Ergebnisse wichtig ist Du übst Coding Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Coding Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. Coding Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „ON oder WHERE bei JOINs“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Coding Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede Coding Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Wie INNER JOIN Zeilen zusammenführt
- ON oder WHERE bei JOINs
- JOIN-Fan-out und Zeilenvervielfachung
- Drei oder mehr Tabellen verknüpfen