1
Foreninger (JOINs) i SQL, del1
Innspill: 5 kommentarer · Kategori: Data og teknologi · Tagger: databaser, join, SQL, studentbidrag
Av: Mikael Brevik, student og veileder i det nye Android-faget
Som ingeniørstudent og tidligere veileder i både «LO171D Programmering i Java» og «LC238D Datamodellering og databaser» har jeg erfart at foreninger i SQL kan være noe vanskelig å forstå seg på. I den sammenheng kompilerte jeg en lengre tekst som konkret beskriver forskjellige måter å forene tabeller på etter SQL-standarden. Artikkelen er nå delt opp i en bloggserie på 5 deler. Først en introduksjon hvor vi tar opp INNER JOIN og NATURAL JOIN, og så mer avanserte foreningstyper i henhold til denne bloggplanen:
- del 2: LEFT OUTER JOIN
- del 3: RIGHT OUTER JOIN
- del 4: FULL OUTER JOIN
- del 5: CROSS JOIN (noen kjappe ord)
Noen ord om foreninger (JOIN)
En forening, eller JOIN som det heter i SQL, er en rasjonell operator på lik linje med utvelgelse av kolonner (projeksjon) eller rader (seleksjon) som skal vises. Det er en operasjon på relasjonsdatabaser som brukes til å koble sammen to eller flere tabeller i en database – gjennom en felles kolonne. Ofte vil det være primærnøkkelen og fremmednøkkelen som blir brukt som bindeledd, men det er også mulig å forene tabeller med bruk av andre felt.
I denne bloggserien kommer jeg til å bruke en rød tråd av eksempler. Det betyr at jeg tar utgangspunkt i de samme tabellene gjennom alle innleggene. Disse tabellene ser slik ut (på rasjonell form):
postal_no(zip, place); person (pid, name, surname, address, zip*);
Vi vet at understrekede attributter er primærnøkler og de som er merket med en asteriks (*) er fremmednøkler. Zip-feltet i tabellen person
er valgfritt (NULL). Vi har her sammenhengen en-til-mange.
Tabellen postal_no
inneholder informasjon over alle postnummer i Norge og ser slik ut:
Tabellen person
inneholder forskjellige personer:
INNER JOIN
INNER JOIN er nok en av de foreningene som kommer til å bli brukt mest. Det er noe som kalles equijoin og betyr rett og slett at man henter ut informasjonen bundet sammen av to felles verdier i en kolonne/attributt
Det som gjør INNER JOIN forskjellig fra noen OUTER JOIN (som LEFT/RIGHT) er at vi henter kun ut de radene (også kalt «tupler») som har verdier i begge de kolonnene som vi forener om. Vi skal se mer på dette i eksempelet under.
I SQL vil INNER som regel være et valgfritt nøkkelord. Man kan med andre ord sløyfe det og kun skrive JOIN. Mange mener videre at det er god praksis å ha med nøkkelordet for å lettere tolke spørringene når man leser de.
Eksempel på [INNER] JOIN
Dersom vi nå vil sende ut et brev til personene vi har i databasen vår må vi hente ut en liste av personer med registrert adresse. Som vi vet er zip
et NULL felt i tabellen person
, så det er ikke alle personer som har registrert adresse til seg. Vi bruker INNER JOIN med seleksjon for å vise til hvilke felt som skal brukes til å knytte dataene sammen.
Vi kan også skrive dette på en alternativ måte.
Hva som vil skje dersom man ikke bruker seleksjon her vil vi få vite mer om i blogginnlegget «del 5: CROSS JOIN».
Om vi husker fra utlistingen av personer ovenfor vet vi at det er 3 innlegg i denne tabellen, mens her er det 2. Vi får ikke listet ut alle poststedene som ikke er bebodd av noen medlemmer i person-tabellen vår, og vi får heller ikke listet ut personer som ikke har noe poststed registrert. Merk videre at vi får skrevet ut kolonnen zip
to ganger. Dette er en gang for postal_no
og en gang for person
.
NATURAL JOIN
NATURAL JOIN er i all basis det samme som en INNER JOIN. Eneste forskjellen er at vi fjerner duplikatkolonner. Som påpekt i slutten av forrige avsnitt vil vi få frem zip-kolonnen to ganger med bruk av INNER JOIN (uten projeksjon). NATURAL JOIN vil skrive ut kun en kolonne for alle par av kolonner med samme navn.
Eksempel på NATURAL JOIN
Vi ser her at ZIP kommer kun ut som en kolonne. Desverre støtter ikke JavaDB NATURAL JOIN. Så da må man supplementere med en projeksjon:
Se bort i fra USING()
her. Den er brukt for å korte ned SQL-spørringen. USING()
kan bli brukt siden begge attributtene har samme navn i disse tabellene. Så det blir en slags snarvei for ON field = field2
Følg med på neste del når vi tar for oss LEFT OUTER JOIN. Bruker du SQL i praksis? Hva synes du om foreninger? Kom gjerne med tilbakemeldinger i kommentarfeltet.
Dette innlegget har 5 kommentarer. Gjerne bidra :-)
Skrevet av: itfag (totalt 65 blogginnlegg)
Tweets that mention Foreninger (JOINs) i SQL, del1 · itfag -- Topsy.com · 1. februar, 2011, kl. 14:05
[…] This post was mentioned on Twitter by Svend Andreas Horgen, itfag.hist.no. itfag.hist.no said: Er du interessert i SQL? Veldig bra bloggpost av student Mikael Brevik om de ulike JOIN-variantene i SQL: http://bit.ly/hJISSi […]
Foreninger (JOINs) i SQL, del 2 · itfag · 3. februar, 2011, kl. 22:41
[…] Foreninger (JOINs) i SQL, del1 […]
Foreninger (JOINs) i SQL, del 3 · itfag · 10. februar, 2011, kl. 20:20
[…] Foreninger (JOINs) i SQL, del1 Arkiv […]
Foreninger (JOINs) i SQL, del 4 · itfag · 16. februar, 2011, kl. 12:45
[…] er del 4 av bloggserien om JOIN, og vi skal nå se på FULL OUTER JOIN. Del 1 handlet om INNER JOIN og NATURAL JOIN. Del 2 handlet om LEFT OUTER JOIN og del 3 om RIGHT OUTER JOIN. Her er tabellene vi bruker i denne […]
Foreninger (JOINs) i SQL, del 5 · itfag · 25. februar, 2011, kl. 15:09
[…] er siste del av bloggserien om JOIN, og vi skal nå se på CROSS JOIN. Del 1 handlet om INNER JOIN og NATURAL JOIN. Del 2 handlet om LEFT OUTER JOIN og del 3 om RIGHT OUTER JOIN. Del 4 handlet om FULL OUTER […]