Forberedelse til SQL-interview · Lektion

LEFT JOIN og bevarelse af ikke-matchende rækker

Hvad LEFT JOIN bevarer, og hvordan NULL'er vises for rækker uden match

Lektion 1 af 413 trin

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

Så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 match

Hvor 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 | 0

Fæ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 |   0

Venstre 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.

Gratis at komme i gang

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

  1. LEFT JOIN og bevarelse af ikke-matchende rækker
  2. Semantik for RIGHT og FULL OUTER JOIN
  3. Find rækker uden match (anti-join)
  4. Fælden med WHERE på outer join
← Tilbage til Forberedelse til SQL-interview