Förberedelser inför SQL-intervjun · Lektion

ON kontra WHERE i joinar

När ett predikat hör hemma i ON respektive WHERE och varför det påverkar resultatet

Lektion 2 av 413 steg

ON kontra WHERE i joinar är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.

Ett predikat kan stå på två ställen

När du kan skriva en INNER JOIN kommer nästa intervjufråga att bli mer precis: ska det här villkoret stå i ON eller i WHERE?

För en INNER JOIN är svaret ofta "det spelar ingen roll för resultatet". Men så fort du byter till en outer join förändrar valet svaret helt. Intervjuare ställer frågan just därför att nybörjare av vana placerar allt i WHERE.

Den här lektionen gör regeln tydlig.

Vad ON gör

Med ON-satsen definierar du hur rader paras ihop. Den utvärderas när joinen byggs och avgör vilken rad från den vänstra tabellen som matchar vilken rad från den högra.

Tänk på ON som svaret på frågan: "hör de här två raderna ihop?"

SELECT c.name, o.amount
FROM customers c
JOIN orders o
  ON o.customer_id = c.id;   -- pairing rule

Vad WHERE gör

Med WHERE-satsen filtrerar du efter att joinen har skapat de sammanslagna raderna. Den filtrerar resultatmängden och tar bort rader som inte klarar testet.

Tänk på WHERE som svaret på frågan: "nu när raderna har joinats, vilka av dem vill jag behålla?"

SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;   -- filter after pairing

För INNER JOIN ger de ofta samma resultat

För en INNER JOIN ger ett extra filter samma resultat oavsett om du placerar det i ON eller WHERE. Båda frågorna nedan returnerar endast Adas order på 50 dollar och Bobs order på 99 dollar.

Eftersom omatchade rader redan tas bort av en inner join förändrar det inte vilka rader som blir kvar när du flyttar predikatet.

-- 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;

Varför stilkonventioner ändå föredrar ON för joinnycklar

Även när resultaten är desamma säger konventionen: placera villkor för joinrelationen i ON och verksamhetsfilter i WHERE.

  • ON: o.customer_id = c.id (hur tabellerna hänger ihop)
  • WHERE: o.amount > 30 (vilka resultat du vill ha)

Den här uppdelningen gör avsikten tydlig för nästa läsare och för intervjuaren som bedömer din stil.

Där det verkligen spelar roll: outer joinar

Skillnaden blir avgörande med en LEFT JOIN, som behåller varje rad till vänster även när ingen rad till höger matchar. Här är en snabb förhandsvisning med customers och orders, där Cleo inte har några order.

En LEFT JOIN behåller Cleo med NULL i orderkolumnerna. Se nu vad ON respektive WHERE gör med hennes rad.

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 i ON: Raderna bevaras

Placera villkoret amount > 30 i ON i en LEFT JOIN, så påverkar det bara vilka rader till höger som kopplas på. Omatchade rader till vänster behålls fortfarande, men får NULL-värden.

Cleo finns kvar. En order som inte klarar testet kopplas helt enkelt inte på, vilket lämnar ett NULL-värde.

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 i WHERE: Outer joinen kollapsar

Flytta samma villkor till WHERE, så filtrerar du det joinade resultatet. Cleos rad har amount = NULL, och NULL > 30 är inte sant, så hon tas bort.

LEFT JOIN fungerar då i praktiken som en INNER JOIN. Det här är den mest välkända joinfällan under intervjuer.

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)

Regeln att memorera

Uttryck det så här under en intervju:

  • Ett villkor i ON avgör om raden till höger kopplas på; raderna till vänster bevaras.
  • Ett villkor i WHERE filtrerar de slutliga raderna och kan ta bort bevarade rader till vänster när det berör en kolumn som kan innehålla NULL.

För outer joinar ska villkor på den valfria tabellen alltså placeras i ON, såvida du inte avsiktligt vill ta bort omatchade rader.

Det legitima användningsfallet för WHERE med NULL

Det finns ett fall där det är helt rätt att filtrera en kolumn från en outer join i WHERE: en anti-join. Genom att testa IS NULL hittar du vänstra rader som saknade en matchning.

Här behåller WHERE avsiktligt endast de omatchade raderna och returnerar kunder utan order. Samma mekanik, men motsatt avsikt.

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 -> Cleo

Snabbt mentalt test

Använd den här checklistan när du ser ett joinvillkor, innan quizet:

  • Är det en joinnyckel som kopplar ihop tabellerna? -> ON.
  • Är det ett filter på den obligatoriska tabellen? -> WHERE eller ON fungerar båda.
  • Är det ett filter på den valfria (outer-)tabellen och vill du behålla omatchade rader? -> ON.
  • Vill du hitta omatchningar? -> WHERE ... IS NULL.

Snabbtest

Tillämpa regeln för ON och WHERE på en outer join.

Sammanfattning: ON jämfört med WHERE

Viktiga punkter att ta med till intervjun:

  • ON styr hur rader paras ihop och, för outer joinar, om den valfria raden kopplas på, samtidigt som den bevarade sidan behålls.
  • WHERE filtrerar det redan joinade resultatet och kan ta bort bevarade rader.
  • I en INNER JOIN kan de två ofta användas omväxlande; i outer joinar kan de inte det.
  • Filter på den yttre tabellen hör hemma i ON, såvida du inte avsiktligt vill göra en anti-join med IS NULL i WHERE.
Gratis att börja

Lär dig SQL med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
30
Lektioner
120

Vanliga frågor

Är lektionen ”ON kontra WHERE i joinar” gratis?

Ja – hela texten till ”ON kontra WHERE i joinar” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.

Vad lär jag mig i ”ON kontra WHERE i joinar”?

När ett predikat hör hemma i ON respektive WHERE och varför det påverkar resultatet Ni övar på Förberedelser inför SQL-intervjun med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Förberedelser inför SQL-intervjun?

Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”ON kontra WHERE i joinar”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Förberedelser inför SQL-intervjun-lektionen?

Ja. Varje Förberedelser inför SQL-intervjun-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Så matchar INNER JOIN rader
  2. ON kontra WHERE i joinar
  3. Join-fan-out och radmultiplikation
  4. Joina tre eller fler tabeller
← Tillbaka till Förberedelser inför SQL-intervjun