LEFT JOIN og bevarelse af ikke-matchende rækker
Hvad LEFT JOIN bevarer, og hvordan NULL'er vises for rækker uden match
LEFT JOIN og bevarelse af ikke-matchende rækker er en gratis Forberedelse til SQL-interview-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til SQL-interview, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.
Interviewsituationen
En interviewer siger: "Vis alle kunder og deres ordrer, også kunder, der aldrig har afgivet en ordre." Et INNER JOIN udelader kunderne uden ordrer, så det opfylder ikke dette krav. Opgaven løses med et LEFT JOIN.
Et LEFT JOIN bevarer hver eneste række fra tabellen til venstre (den, der nævnes først), og tilføjer matchende rækker fra tabellen til højre, når de findes. Denne lektion opbygger den præcise mentale model, som interviewere forventer.
Hvad LEFT JOIN garanterer
Kernegarantien er: Hver række fra den venstre tabel vises mindst én gang i resultatet, uanset om den har et match eller ej.
- Hvis en række i venstre tabel finder match på højre side, får du én resultatrække pr. match.
- Hvis en række i venstre tabel ikke finder et match, får du stadig én resultatrække, hvor alle kolonner fra højre tabel er sat til
NULL.
Derfor kalder interviewere det et ydre join: Rækker, der ligger uden for mængden af match, bevares i stedet for at blive kasseret.
De to tabeller
I hele denne lektion bruger vi to enkle tabeller. customers indeholder alle kunder, og orders registrerer køb og refererer til en kunde via customer_id.
Bemærk, at kunde 3 (Carol) ikke har nogen række i orders. Denne kunde uden match er netop den, et LEFT JOIN skal bevare.
-- customers
-- id | name
-- 1 | Alice
-- 2 | Bob
-- 3 | Carol
-- orders
-- id | customer_id | amount
-- 10 | 1 | 50
-- 11 | 1 | 75
-- 12 | 2 | 20Sådan skriver du LEFT JOIN
Syntaksen ligner et inner join, hvor INNER udskiftes med LEFT (ordet OUTER er valgfrit: LEFT JOIN og LEFT OUTER JOIN er identiske).
Tabellen, der står før nøgleordet, er den bevarede venstre side. Rækkefølgen betyder noget: customers LEFT JOIN orders bevarer alle kunder, ikke alle ordrer.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id;Sådan læser du resultatet
Her er resultatet af forespørgslen. Alice havde to match, så hun vises to gange. Bob havde ét match. Carol havde intet match, så hun vises stadig med NULL i kolonnen amount.
Den ene række for Carol med NULL er det karakteristiske tegn på et LEFT JOIN. En interviewer, der ser dig tænke højt, vil gerne høre: "Umatchede rækker fra venstre side bevares med NULL-værdier på højre side."
-- name | amount
-- Alice | 50
-- Alice | 75
-- Bob | 20
-- Carol | NULL <-- preserved, no matchHvor NULL-værdierne kommer fra
NULL-værdien er ikke gemt noget sted. Databasen genererer den, fordi der ikke findes en række i højre tabel, som kan levere amount.
Alle kolonner fra højre tabel bliver NULL for en venstrerække uden match: o.id, o.customer_id og o.amount er alle NULL i Carols række. Det er vigtigt, fordi det, at o.customer_id er NULL, ikke betyder, at kunden ikke har et id; det betyder, at der slet ikke var nogen matchende ordre.
Optælling af ordrer pr. kunde
Et almindeligt opfølgende spørgsmål er: "Hvor mange ordrer har hver kunde, inklusive kunder med nul ordrer?" Et LEFT JOIN kombineret med COUNT løser det, men du skal tælle kolonnen fra højre tabel, ikke *.
COUNT(o.id) ignorerer NULL, så Carol får 0. COUNT(*) ville fejlagtigt give Carol 1, fordi den genererede NULL-række stadig tæller som en række.
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 | 0Fælden med COUNT(*) og COUNT(kolonne)
Dette er en klassisk interviewfælde. Efter et LEFT JOIN findes den umatchede venstrerække fysisk i resultatet med NULL i kolonnerne fra højre tabel.
COUNT(*)tæller rækken og giver 1 for en kunde uden ordrer.COUNT(o.id)springer NULL over og giver korrekt 0.
Tæl altid en kolonne, der er NULL på siden uden match, når du har brug for faktiske nuller.
-- 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;Summering med LEFT JOIN
Aggregeringer ud over COUNT håndterer de genererede NULL-værdier uden problemer. SUM ignorerer NULL, så en kunde uden match får NULL (ikke en fejl).
Interviewere vil ofte have nul i stedet for NULL i rapporter. Omslut aggregatet med COALESCE for at erstatte det med en standardværdi.
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 | 0Venstre og højre tabel, forklaret klart
Når en interviewer spørger "hvilken tabel bevares?", skal du svare sikkert: Den, der står til venstre for JOIN-nøgleordet. Læs fra venstre mod højre.
A LEFT JOIN B betyder: Behold alle rækker i A. Hvis du i stedet vil beholde alle rækker i B, kan du enten vende rækkefølgen og skrive B LEFT JOIN A eller bruge et RIGHT JOIN. De fleste udviklingsteams foretrækker udelukkende LEFT JOIN af hensyn til læsbarheden og omarrangerer blot tabellerne.
En mental tjekliste
Når du ser et LEFT JOIN i et interview, skal du sige denne tjekliste højt:
- Hvilken side bevares? Den venstre tabel; alle rækker bevares.
- Rækker uden match? De vises én gang med NULL-værdier fra højre side.
- Optælling? Brug
COUNT(right_col)for at få faktiske nuller. - Summering? Omslut med
COALESCE, hvis du har brug for 0 i stedet for NULL.
At sætte disse punkter på ord signalerer grundighed på seniorniveau.
Hurtigt tjek
Afprøv din intuition om LEFT JOIN ved optælling.
Opsummering
LEFT JOIN bevarer hver række fra den venstre tabel. Matchende venstrerækker kobles sammen med deres match på højre side, mens venstrerækker uden match bevares én gang med NULL i alle kolonner fra højre tabel.
- Den venstre tabel er den, der står før nøgleordet
JOIN. - Genererede NULL-værdier markerer rækker uden match.
COUNT(right_col)giver faktiske nuller;COUNT(*)gør ikke.COALESCE(SUM(...), 0)omdanner NULL-totaler til nul.
Dette er grundlaget for at finde manglende data og anti-joins i de kommende lektioner.
Lær SQL med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 30
- Lektioner
- 120
Ofte stillede spørgsmål
Er lektionen “LEFT JOIN og bevarelse af ikke-matchende rækker” gratis?
Ja — hele teksten til “LEFT JOIN og bevarelse af ikke-matchende rækker” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til SQL-interview-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “LEFT JOIN og bevarelse af ikke-matchende rækker”?
Hvad LEFT JOIN bevarer, og hvordan NULL'er vises for rækker uden match Du øver dig i Forberedelse til SQL-interview med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Forberedelse til SQL-interview?
Der kræves ingen tidligere erfaring. Forberedelse til SQL-interview på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “LEFT JOIN og bevarelse af ikke-matchende rækker”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Forberedelse til SQL-interview-lektion?
Ja. Alle Forberedelse til SQL-interview-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- LEFT JOIN og bevarelse af ikke-matchende rækker
- Semantik for RIGHT og FULL OUTER JOIN
- Find rækker uden match (anti-join)
- Fælden med WHERE på outer join