Förberedelse inför kodningsintervjuer · Lektion

LEFT JOIN och bevarande av omatchade rader

Vad LEFT JOIN behåller och hur NULL visas för rader utan matchning

Lektion 1 av 413 steg

LEFT JOIN och bevarande av omatchade rader är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 1 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örberedelse inför kodningsintervjuer, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.

Intervjusituationen

En intervjuare säger: "Lista alla kunder och deras beställningar, även kunder som aldrig har lagt någon beställning." En INNER JOIN tar bort kunderna utan beställningar, så den uppfyller inte kravet. Här behövs en LEFT JOIN.

En LEFT JOIN behåller varje rad från den vänstra (först angivna) tabellen och kopplar till matchande rader från den högra tabellen när sådana finns. Den här lektionen bygger den exakta mentala modell som intervjuare förväntar sig.

Vad LEFT JOIN garanterar

Kärnlöftet är: varje rad från den vänstra tabellen visas i resultatet minst en gång, oavsett om den matchar eller inte.

  • Om en rad i den vänstra tabellen hittar matchningar i den högra får ni en resultatrad per matchning.
  • Om en rad i den vänstra tabellen inte hittar någon matchning får ni ändå en resultatrad, där alla kolumner från den högra tabellen är satta till NULL.

Det är därför intervjuare kallar den en outer join: rader som hamnar utanför mängden av matchningar bevaras i stället för att tas bort.

De två tabellerna

Genom hela lektionen använder vi två enkla tabeller. customers innehåller alla kunder och orders registrerar köp samt refererar till en kund via customer_id.

Observera att kund 3 (Carol) inte har någon rad i orders. Den omatchade kunden är precis den rad som en LEFT JOIN måste bevara.

-- customers
-- id | name
--  1 | Alice
--  2 | Bob
--  3 | Carol

-- orders
-- id | customer_id | amount
-- 10 |     1       |  50
-- 11 |     1       |  75
-- 12 |     2       |  20

Skriva en LEFT JOIN

Syntaxen liknar en inner join, men INNER byts ut mot LEFT (ordet OUTER är valfritt: LEFT JOIN och LEFT OUTER JOIN är identiska).

Tabellen som står före nyckelordet är den bevarade vänstra sidan. Ordningen spelar roll: customers LEFT JOIN orders behåller alla kunder, inte alla beställningar.

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

Läsa resultatet

Här är resultatet från frågan. Alice matchade två gånger, så hon visas två gånger. Bob matchade en gång. Carol matchade ingenting, så hon visas fortfarande med NULL i kolumnen amount.

Den enda Carol-raden med NULL är kännetecknet för en LEFT JOIN. En intervjuare som lyssnar när ni resonerar vill höra: "Omatchade rader på vänstersidan överlever med NULL-värden på högersidan."

-- name  | amount
-- Alice |  50
-- Alice |  75
-- Bob   |  20
-- Carol | NULL   <-- preserved, no match

Var NULL-värdena kommer ifrån

NULL-värdet lagras inte någonstans. Databasen skapar det eftersom det inte finns någon rad i den högra tabellen som kan tillhandahålla amount.

Varje kolumn från den högra tabellen blir NULL för en omatchad rad på vänstersidan: o.id, o.customer_id och o.amount är alla NULL i Carols rad. Det är viktigt, eftersom att o.customer_id är NULL inte betyder att kunden saknar id, utan att det inte fanns någon matchande beställning alls.

Räkna beställningar per kund

En vanlig följdfråga är: "Hur många beställningar har varje kund, inklusive noll?" En LEFT JOIN tillsammans med COUNT löser det, men ni måste räkna en kolumn från den högra tabellen, inte *.

COUNT(o.id) ignorerar NULL-värden, så Carol får 0. COUNT(*) skulle felaktigt ge Carol 1, eftersom raden med det skapade NULL-värdet fortfarande räknas som en rad.

SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 2
-- Bob   | 1
-- Carol | 0

Fällan med COUNT(*) kontra COUNT(column)

Det här är en klassisk intervjufälla. Efter en LEFT JOIN finns den omatchade raden från vänstersidan fysiskt i resultatet, med NULL-värden i kolumnerna från högersidan.

  • COUNT(*) räknar den raden och ger 1 för en kund utan beställningar.
  • COUNT(o.id) hoppar över NULL-värdet och ger korrekt 0.

Räkna alltid en kolumn som är NULL på sidan utan matchning när ni behöver verkliga nollvärden.

-- WRONG: Carol shows 1
SELECT c.name, COUNT(*) AS n
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

Summera med LEFT JOIN

Andra aggregat än COUNT hanterar de skapade NULL-värdena på ett smidigt sätt. SUM ignorerar NULL-värden, så en kund utan matchning ger NULL (inte ett fel).

Intervjuare vill ofta ha noll i stället för NULL i rapporter. Omslut aggregatet med COALESCE för att ersätta det med ett standardvärde.

SELECT c.name,
       COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 125
-- Bob   |  20
-- Carol |   0

Vänster- och högertabellen, tydligt uttryckt

När en intervjuare frågar "vilken tabell bevaras?" svarar ni självsäkert: tabellen till vänster om nyckelordet JOIN. Läs frågan från vänster till höger.

A LEFT JOIN B betyder att alla rader i A behålls. Om ni i stället vill behålla alla rader i B kan ni antingen vända på ordningen till B LEFT JOIN A eller använda en RIGHT JOIN. De flesta team föredrar att enbart använda LEFT JOIN för läsbarhet och ordnar helt enkelt tabellerna därefter.

En mental checklista

När ni ser en LEFT JOIN under en intervju kan ni gå igenom följande checklista högt:

  • Vilken sida bevaras? Den vänstra tabellen; alla rader behålls.
  • Omatchade rader? De visas en gång med NULL-värden från högersidan.
  • Räkna? Använd COUNT(right_col) för verkliga nollvärden.
  • Summera? Omslut med COALESCE om ni behöver 0 i stället för NULL.

Att uttrycka den här checklistan i ord visar noggrannhet på seniornivå.

Snabb kontroll

Testa er intuition kring LEFT JOIN när ni räknar.

Sammanfattning

LEFT JOIN bevarar varje rad i den vänstra tabellen. Matchade rader på vänstersidan kopplas till sina matchningar på högersidan, medan omatchade rader på vänstersidan överlever en gång med NULL i alla kolumner från högersidan.

  • Den vänstra tabellen är den som står före nyckelordet JOIN.
  • Skapade NULL-värden markerar rader utan matchning.
  • COUNT(right_col) ger verkliga nollvärden; COUNT(*) gör det inte.
  • COALESCE(SUM(...), 0) omvandlar NULL-summor till noll.

Detta är grunden för att hitta saknade data och anti-joins i de kommande lektionerna.

Gratis att börja

Lär dig Förberedelse inför kodningsintervjuer 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
90
Lektioner
360

Vanliga frågor

Är lektionen ”LEFT JOIN och bevarande av omatchade rader” gratis?

Ja – hela texten till ”LEFT JOIN och bevarande av omatchade rader” 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örberedelse inför kodningsintervjuer, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.

Vad lär jag mig i ”LEFT JOIN och bevarande av omatchade rader”?

Vad LEFT JOIN behåller och hur NULL visas för rader utan matchning Ni övar på Förberedelse inför kodningsintervjuer 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örberedelse inför kodningsintervjuer?

Du behöver inga förkunskaper. Utbildningen i Förberedelse inför kodningsintervjuer 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 1 av 4.

Hur lång tid tar lektionen ”LEFT JOIN och bevarande av omatchade rader”?

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örberedelse inför kodningsintervjuer-lektionen?

Ja. Varje Förberedelse inför kodningsintervjuer-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. LEFT JOIN och bevarande av omatchade rader
  2. Semantik för RIGHT och FULL OUTER JOIN
  3. Hitta rader utan matchning (anti-join)
  4. Fällan med WHERE på en outer join
← Tillbaka till Förberedelse inför kodningsintervjuer