Spring til indhold
Academi.dk

SQL

JOIN forklaret

Let øvet DA↔EN-ordliste

Et JOIN henter rækker fra to tabeller på én gang og parrer dem efter en betingelse, næsten altid en fremmednøgle mod en primærnøgle. INNER JOIN beholder kun de rækker, der har en partner; LEFT JOIN beholder alle fra venstre tabel.

Forudsætter, at du har set where - filtrér rækker , primærnøgler og fremmednøgler .

Hvorfor der skal joines

Data ligger fordelt i tabeller, fordi hver oplysning kun skal stå ét sted. Se normalisering. Men når du skal vise noget, skal delene samles igen. Det er hvad et join gør.

SELECT k.navn, o.dato, o.id
FROM kunde AS k
JOIN ordre AS o ON o.kunde_id = k.id
ORDER BY o.dato DESC;

ON er koblingsbetingelsen: hvornår hører en række i den ene tabel sammen med en række i den anden. Her: når ordrens kunde_id er lig med kundens id.

INNER JOIN: kun dem med partner

JOIN alene betyder INNER JOIN. Rækker uden en partner falder ud i begge retninger.

Har du fem kunder, og to af dem har aldrig lagt en ordre, giver forespørgslen ovenfor kun rækker for de tre. Det er ofte det, du vil, og lige så ofte kilden til spørgsmålet “hvor blev de sidste to af?”

LEFT JOIN: behold alle fra venstre

SELECT k.navn, o.id AS ordre_id
FROM kunde AS k
LEFT JOIN ordre AS o ON o.kunde_id = k.id;

Nu kommer alle fem kunder med. De to uden ordrer får NULL i kolonnerne fra ordre. Det er den rigtige form, når spørgsmålet er “vis alle kunder, og hvad de eventuelt har købt”.

Kombinationen med IS NULL er et klassisk trick til at finde dem, der mangler noget:

SELECT k.navn
FROM kunde AS k
LEFT JOIN ordre AS o ON o.kunde_id = k.id
WHERE o.id IS NULL;

Det giver netop de kunder, der aldrig har lagt en ordre. Den er værd at kunne.

RIGHT JOIN er det samme spejlvendt og bruges sjældent. Man bytter i stedet om på tabellerne. FULL OUTER JOIN beholder alle fra begge sider.

Flere tabeller i træk

SELECT k.navn, p.navn AS produkt, l.antal
FROM kunde AS k
JOIN ordre AS o      ON o.kunde_id = k.id
JOIN ordrelinje AS l ON l.ordre_id = o.id
JOIN produkt AS p    ON p.id = l.produkt_id
WHERE o.dato >= '2026-01-01';

Du hægter dem på én ad gangen. Bliv ved med at læse forespørgslen som en sætning: kunder, deres ordrer, linjerne på ordrerne, og produkterne på linjerne.

Sæt betingelsen det rigtige sted

I et LEFT JOIN er der forskel på ON og WHERE:

-- beholder alle kunder, viser kun ordrer fra 2026
LEFT JOIN ordre AS o ON o.kunde_id = k.id AND o.dato >= '2026-01-01'

-- smider kunder uden ordrer i 2026 væk igen
LEFT JOIN ordre AS o ON o.kunde_id = k.id
WHERE o.dato >= '2026-01-01'

Den anden opfører sig som et INNER JOIN, fordi NULL >= '2026-01-01' ikke er sand. Det er en yndet eksamensfælde.

Kort opsamling

  • JOIN … ON parrer rækker fra to tabeller.
  • INNER beholder kun par, LEFT beholder alt fra venstre.
  • LEFT JOIN plus IS NULL finder dem uden partner.
  • Filtre på den højre tabel hører i ON, ikke i WHERE.

Læs videre

Senest gennemgået .