Forskjellen mellom LEFT JOIN, RIGHT JOIN og FULL JOIN i SQL

Lær forskjellen mellom LEFT JOIN, RIGHT JOIN og FULL JOIN i SQL. Ytre joins forklart med eksempler. Gratis video og guide.

Du vil lage en oversikt over alle ansatte og hvor mange kunder hver av dem håndterer. Med INNER JOIN mister du ansatte som ikke har noen kunder, og det er akkurat de du også trenger å se. Ytre JOINs løser dette ved å beholde alle rader fra én eller begge tabellene, selv når det ikke finnes en match.

Det finnes tre typer ytre JOINs: LEFT JOIN, RIGHT JOIN og FULL OUTER JOIN. I praksis bruker du nesten alltid LEFT JOIN.

LEFT JOIN: behold alt fra venstre tabell

LEFT JOIN returnerer alle rader fra den venstre tabellen (den som står først i spørringen), uansett om det finnes en match i den høyre tabellen. Der det ikke er match, fylles kolonnene fra den høyre tabellen med NULL.

SELECT e.first_name, e.last_name, c.first_name AS customer_name FROM employees AS e LEFT JOIN customers AS c ON e.employee_id = c.support_rep_id;

Denne henter alle ansatte. For de som har kunder, vises kundenavnet. For de som ikke har noen kunder, vises NULL i customer_name-kolonnen. Ingen ansatte forsvinner fra resultatet.

Sammenlign med INNER JOIN, som bare ville gitt deg ansatte som har minst én kunde. LEFT JOIN gir deg hele bildet.

Telle med LEFT JOIN

Et vanlig mønster er å bruke LEFT JOIN sammen med COUNT for å telle relasjoner, inkludert de som er null:

SELECT e.first_name, e.last_name, COUNT(c.customer_id) AS antall_kunder FROM employees AS e LEFT JOIN customers AS c ON e.employee_id = c.support_rep_id GROUP BY e.employee_id;

Her teller COUNT(c.customer_id) antall kunder per ansatt. COUNT ignorerer NULL-verdier, så ansatte uten kunder får 0. Hadde du brukt COUNT(*) i stedet, ville de fått 1 (fordi LEFT JOIN alltid gir minst én rad per ansatt).

Denne forskjellen er viktig: bruk COUNT(kolonne fra høyre tabell) når du teller med LEFT JOIN, ikke COUNT(*).

RIGHT JOIN: behold alt fra høyre tabell

RIGHT JOIN er speilbildet av LEFT JOIN. Den beholder alle rader fra den høyre tabellen og fyller med NULL der det ikke er match i den venstre.

SELECT e.first_name, c.first_name AS customer_name FROM employees AS e RIGHT JOIN customers AS c ON e.employee_id = c.support_rep_id;

Her beholdes alle kunder, selv de uten en ansatt tilknyttet. I praksis brukes RIGHT JOIN sjelden, fordi du kan oppnå det samme ved å bytte rekkefølgen på tabellene og bruke LEFT JOIN. De fleste SQL-utviklere holder seg til LEFT JOIN for konsistens.

FULL OUTER JOIN: behold alt fra begge

FULL OUTER JOIN beholder alle rader fra begge tabeller. Der det finnes match, kobles radene sammen. Der det ikke finnes match, fylles den manglende siden med NULL.

SELECT e.first_name AS employee, c.first_name AS customer FROM employees AS e FULL OUTER JOIN customers AS c ON e.employee_id = c.support_rep_id;

Resultatet inkluderer ansatte uten kunder (customer er NULL) og kunder uten ansatt (employee er NULL), i tillegg til alle matchende par.

FULL OUTER JOIN er nyttig for å finne «hull» i dataene, altså rader som mangler en relasjon i begge retninger. Det er mindre vanlig enn LEFT JOIN, men verdifullt i dataanalyse og kvalitetskontroll.

SQLite-begrensninger

SQLite støtter bare INNER JOIN og LEFT JOIN. RIGHT JOIN og FULL OUTER JOIN er ikke tilgjengelige (i eldre versjoner, nyere versjoner har delvis støtte). Det er sjelden et problem i praksis, fordi LEFT JOIN dekker de fleste behov. Trenger du RIGHT JOIN, bytter du bare rekkefølgen på tabellene.

Andre databaser som PostgreSQL, MySQL og SQL Server støtter alle fire JOIN-typene fullt ut.

Finne rader uten match

En kraftig teknikk med LEFT JOIN er å finne rader som mangler en relasjon. For eksempel: kunder som aldri har fått en faktura.

SELECT c.first_name, c.last_name FROM customers AS c LEFT JOIN invoices AS i ON c.customer_id = i.customer_id WHERE i.invoice_id IS NULL;

LEFT JOIN beholder alle kunder. WHERE i.invoice_id IS NULL filtrerer bort de som har fakturaer, og du sitter igjen med kunder uten noen faktura. Dette mønsteret er svært nyttig for å finne manglende data, inaktive brukere eller ubrukte ressurser.

Venstre og høyre: rekkefølgen betyr noe

I en LEFT JOIN er «venstre» den tabellen som står etter FROM, og «høyre» er den som står etter LEFT JOIN. Rekkefølgen du skriver tabellene i bestemmer hva som beholdes:

  • FROM customers LEFT JOIN invoices beholder alle kunder
  • FROM invoices LEFT JOIN customers beholder alle fakturaer

Vær bevisst på hvilken tabell du setter først. Det avgjør hvilke rader som garantert er med i resultatet.

Kombinere med andre klausuler

Ytre JOINs fungerer med alle de vanlige SQL-klausulene. Du kan filtrere med WHERE, gruppere med GROUP BY, filtrere grupper med HAVING, og sortere med ORDER BY:

SELECT e.first_name, COUNT(c.customer_id) AS antall FROM employees AS e LEFT JOIN customers AS c ON e.employee_id = c.support_rep_id GROUP BY e.employee_id HAVING COUNT(c.customer_id) >= 10 ORDER BY antall DESC;

Vanlige feil med ytre JOINs

  • Bruke WHERE på høyre tabell i LEFT JOIN. WHERE c.country = 'Norway' etter en LEFT JOIN filtrerer bort alle NULL-radene, og du ender opp med en INNER JOIN i praksis. Flytt betingelsen til ON i stedet.
  • Forveksle LEFT og RIGHT. Husk at LEFT beholder tabellen etter FROM, RIGHT beholder tabellen etter JOIN.
  • Bruke COUNT(*) med LEFT JOIN. COUNT(*) teller alle rader, inkludert de med NULL. Bruk COUNT(kolonne) for å telle bare matchende rader.

Neste steg

Med INNER JOIN og LEFT JOIN har du verktøyene du trenger for å koble tabeller i SQL. Lær å bruke AS for aliaser effektivt, slik at JOIN-spørringene dine er lette å lese og vedlikeholde.

Denne videoen er hentet fra kurset SQL for nybegynnere på Utdannet.no. Kurset dekker alle JOIN-typene med praktiske eksempler og øvelser du kan jobbe med i eget tempo.