SQL
JOIN forklaret
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 … ONparrer rækker fra to tabeller.INNERbeholder kun par,LEFTbeholder alt fra venstre.LEFT JOINplusIS NULLfinder dem uden partner.- Filtre på den højre tabel hører i
ON, ikke iWHERE.
Læs videre
- Primærnøgler og fremmednøgler Primærnøgler og fremmednøgler forklaret på dansk med eksempler i SQL. Hvorfor de findes, hvordan de sættes op, og hvad referentiel integritet betyder.
- GROUP BY og aggregering GROUP BY i SQL forklaret på dansk: COUNT, SUM og AVG, forskellen på WHERE og HAVING, og hvorfor du får en fejl om kolonner der ikke er i gruppen.
- SELECT - hent data SELECT i SQL forklaret på dansk: kolonner, ORDER BY, DISTINCT og aliasser. Med eksempler og rækkefølgen databasen faktisk udfører delene i.
Senest gennemgået .