Avanserte spørringer i SQL



Avanserte spørringer i SQL

av Ole Petter den 30. desember 2019

Sist oppdatert: 1 januar, 2020 kl 16:39

Contents

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».

Fra tabellen overganger

For å finne ut hvilket kontor det meldes overgang fra og til, må det spørres etter offices-tabellen to ganger.

Tabellen offices
SELECT * FROM 
offices A, offices B, overganger C 
WHERE A.officeId = C.fra_sted 
AND B.officeId = C.til_sted
Viser resultatet av spørring mot begge tabellene, to spørringer mot samme tabell offices

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.

Legg igjen en kommentar