Slik kombinerer du tabeller med INNER JOIN i SQL

Lær å koble tabeller med INNER JOIN i SQL. Syntaks, ON-betingelsen og praktiske eksempler. Gratis video og guide.

Du har en tabell med kunder og en tabell med fakturaer. Fakturaene inneholder en kunde-ID, men ikke kundenavnet. For å se hvem som eier hvilken faktura, må du koble de to tabellene sammen. Det gjør du med JOIN.

INNER JOIN er den vanligste typen JOIN. Den returnerer bare rader der det finnes en match i begge tabeller. Kunder uten fakturaer og fakturaer uten kunder blir utelatt.

Grunnleggende syntaks

En INNER JOIN kobler to tabeller basert på en felles kolonne:

SELECT customers.first_name, customers.last_name, invoices.total FROM customers INNER JOIN invoices ON customers.customer_id = invoices.customer_id;

Denne spørringen henter fornavn og etternavn fra customers-tabellen, og totalbeløp fra invoices-tabellen. ON-betingelsen angir hvordan tabellene henger sammen: customer_id i customers-tabellen skal matche customer_id i invoices-tabellen.

Resultatet inneholder én rad for hver faktura som har en matchende kunde. Har en kunde tre fakturaer, får du tre rader med samme kundenavn men ulike beløp.

Kun matchende rader

Det viktigste å forstå med INNER JOIN er at den bare returnerer rader med match i begge tabeller. Hvis en kunde ikke har noen fakturaer, dukker ikke den kunden opp i resultatet. Og hvis en faktura refererer til en kunde som ikke finnes (sjeldent, men mulig), blir den heller ikke med.

Tenk på det som et venndiagram. INNER JOIN gir deg bare det som er i overlappet mellom de to tabellene. Vil du beholde alle rader fra én av tabellene, trenger du en ytre JOIN.

Bruke aliaser for lesbarhet

Å skrive tabellnavnet foran hver kolonne (customers.first_name) blir fort tungvint. AS lar deg gi tabellene korte alias:

SELECT c.first_name, c.last_name, i.total FROM customers AS c INNER JOIN invoices AS i ON c.customer_id = i.customer_id;

Her står c for customers og i for invoices. Resultatet er identisk, men spørringen er kortere og lettere å lese. De fleste som skriver SQL regelmessig bruker aliaser i alle JOINs.

Du kan også droppe AS og bare skrive tabellnavnet etterfulgt av aliaset:

SELECT c.first_name, i.total FROM customers c INNER JOIN invoices i ON c.customer_id = i.customer_id;

Filtrere med WHERE etter JOIN

Etter en JOIN kan du bruke WHERE for å filtrere resultatet videre:

SELECT c.first_name, c.last_name, i.total FROM customers AS c INNER JOIN invoices AS i ON c.customer_id = i.customer_id WHERE i.total > 10;

Denne gir deg bare fakturaer over 10, med kundenavn. JOIN kobler tabellene, WHERE filtrerer radene. Rekkefølgen i spørringen er: SELECT, FROM, JOIN, ON, WHERE.

JOIN med aggregering

Du kan kombinere JOIN med GROUP BY for å beregne aggregater på tvers av tabeller:

SELECT c.first_name, c.last_name, COUNT(*) AS antall_fakturaer, SUM(i.total) AS total_sum FROM customers AS c INNER JOIN invoices AS i ON c.customer_id = i.customer_id GROUP BY c.customer_id;

Her får du antall fakturaer og totalsum per kunde. JOIN henter data fra begge tabeller, GROUP BY grupperer per kunde, og aggregatfunksjonene beregner verdiene for hver gruppe.

Koble flere tabeller

Du er ikke begrenset til to tabeller. Du kan lenke flere JOINs etter hverandre:

SELECT c.first_name, i.invoice_id, il.unit_price FROM customers AS c INNER JOIN invoices AS i ON c.customer_id = i.customer_id INNER JOIN invoice_lines AS il ON i.invoice_id = il.invoice_id;

Denne kobler kunder til fakturaer, og deretter fakturaer til fakturalinjer. Hver JOIN legger til en ny tabell med sin egen ON-betingelse. Du kan fortsette å legge til flere tabeller etter behov.

ON-betingelsen

ON angir hvilke kolonner som brukes for å matche rader mellom tabellene. Vanligvis er det en primærnøkkel i den ene tabellen og en fremmednøkkel i den andre:

  • Primærnøkkel: Den unike identifikatoren i tabellen (for eksempel customer_id i customers)
  • Fremmednøkkel: En kolonne i en annen tabell som refererer til primærnøkkelen (for eksempel customer_id i invoices)

ON-betingelsen bruker nesten alltid = for å matche verdier. Teknisk sett kan du bruke andre operatorer, men det er sjelden nødvendig.

INNER JOIN vs. bare JOIN

I SQL-standarden er JOIN og INNER JOIN det samme. Skriver du bare JOIN uten INNER, får du en INNER JOIN. Mange foretrekker å skrive INNER JOIN eksplisitt for å gjøre det tydelig hvilken type JOIN de bruker, spesielt når spørringen inneholder flere JOINs.

Vanlige feil med INNER JOIN

  • Glemme ON-betingelsen. Uten ON får du et kartesisk produkt, der hver rad i den ene tabellen kobles med hver rad i den andre. Resultatet blir enormt og nesten alltid feil.
  • Tvetydige kolonnenavn. Hvis begge tabellene har en kolonne med samme navn (som customer_id), må du spesifisere hvilken tabell du mener: c.customer_id, ikke bare customer_id.
  • Forvente alle kunder i resultatet. INNER JOIN utelater rader uten match. Trenger du alle kunder, bruk LEFT JOIN.

Neste steg

INNER JOIN dekker de fleste tilfellene der du trenger data fra flere tabeller. Men noen ganger trenger du også radene uten match. Da er ytre JOINs (LEFT, RIGHT, FULL) svaret. Du bør også lære å bruke AS for aliaser effektivt, spesielt når spørringene vokser.

Denne videoen er hentet fra kurset SQL for nybegynnere på Utdannet.no. Kurset tar deg gjennom alt fra grunnleggende SELECT til avanserte JOINs med praktiske øvelser.