Avanserte spørringer i SQL
Avanserte spørringer i SQL
av Ole Petter den 30. desember 2019
Sist oppdatert: 1 januar, 2020 kl 16:39Contents
Likekoblinger og egenkoblinger
Likekobling
De to kolonnene i forrige eksempel var unionskompatible siden de hadde samme verdi, altså officeId i employees-tabellen, og id i office-tabellen.
En indre likekobling eller inner join mellom disse to tabellene med hensyn på primærkolonnen id i office-tabellen og officeId i employees-tabellen består av de radene i kryssproduktet officeId * offices.id.
Med en nøyaktig spørring basert på disse likekoblingene får man kun med de radene med like verdier for koblingskolonnene i resultatet.
Egenkobling
En egenkobling oppstår når to kolonner i samme tabell er fremmednøkkel i en annen tabell. Et eksempel er hvis man har en kolonne for ansatte i en bedrift, og en kolonne for en leder av bedriften, hvor begge er fremmednøkkel i en person-tabell.
Da må det gjennomføres to spørringer mot samme tabell.
"SELECT * FROM
offices A,
persons B,
persons C
WHERE A.leder = B.id AND A.ansatt = C.id";
Ytre koblinger
Bruk av indre koblinger returnerer kun de verdiene som passer begge tabellene. Et eksempel av en aktuell tabell med bruk av egenkobling er hvis en ansatt endrer fra et kontor til et annet. Da vil kontorene være forskjellig, men fremmednøkkelen vil komme fra samme tabell. Da må det spørres to ganger etter tabellen «offices».
Nedenfor er oversikt over tabellen overganger, med både «fra_sted» og «til_sted» med samme fremmednøkkel, id-kolonnen i tabellen «offices».
For å finne ut hvilket kontor det meldes overgang fra og til, må det spørres etter offices-tabellen to ganger.
SELECT * FROM
offices A, offices B, overganger C
WHERE A.officeId = C.fra_sted
AND B.officeId = C.til_sted
Full ytre kobling
En full ytre kobling er unionen av tilsvarende venstre og høyre ytre koblinger, på engelsk full outer join.
Hvis man for eksempel vil vise alle ansatte i tillegg til alle kontorene kan man bruke en FULL OUTER JOIN
SELECT * FROM ansatt A FULL OUTER JOIN offices B
ON A.officeId = B.officeId
Flere eksempler
Hvis vi har to tabeller, tabell A og tabell B, hvor kun et par av tabellene har lik nøkkel som kan sammenlignes, fins det ulike måter å koble de på.
Tabell A
KolA
1
2
3
4
Tabell B
KolB
3
4
5
6
Indre kobling
1 og 2 er unik for tabell A, 5 og 6 er unik for tabell B. Hvis vi bruker inner join til å spørre etter innholdet i tabellene får vi kun de felles radene, 3 og 4 som eksisterer på begge.
SELECT * FROM A INNER JOIN B ON A.KolA = B.KolB;
Denne spørringen vil da returnere:
KolA | KolB
3 | 3
4 | 4
Bruk av INNER JOIN krever at verdien er i begge tabellene.
Venstre ytre kobling
SELECT *
FROM A LEFT OUTER JOIN B ON A.KolA = B.KolB;
Denne spørringen vil føre til følgende resultat:
KolA | KolB
1 | NULL
2 | NULL
3 | 3
4 | 4
LEFT OUTER JOIN returnerer alt fra den første tabellen, tabell A, uansett om tabell B har en tilsvarende rad. I dette tilfellet blir disse radene uten like verdier satt til NULL.
Høyre ytre kobling
SELECT *
FROM A RIGHT OUTER JOIN B ON A.KolA = B.KolB;
Denne spørringen vil gi dette resultatet:
KolA | KolB
3 | 3
4 | 4
NULL| 5
NULL| 6
RIGHT OUTER JOIN returnerer alt fra den andre tabellen (høyre) uansett om den første tabellen har en tilsvarende rad.
Full ytre kobling
SELECT *
FROM A FULL OUTER JOIN B ON A.KolA = B.KolB;
Denne spørringen vil gi:
KolA | KolB
1 | NULL
2 | NULL
3 | 3
4 | 4
NULL| 5
NULL| 6
EN full ytre kobling (FULL OUTER JOIN) returnerer alt fra begge tabellene A og B uansett om de har tilsvarende rader som korresponderer.