Relasjoner – SQL

Når man skal hente, legge til, oppdatere eller slette data fra en relasjonsdatabase så er det naturlig å snakke om SQL. SQL står for Structured Query Language og er et spørrespråk for databaser. Nå skal ikke dette innlegget være noe SQL-kurs for sånt finner man mye bra av på nett. Jeg tenkte heller at jeg skulle vise hvordan noe spørringer vil se ut mot en SQLite-versjon av lege/pasient-databasen fra innlegget «Relasjoner – Normalisering«. Jeg brukte forresten SQLiteStudio til å opprette databasen, til å legge data inn i tabellene og for å kjøre de aktuelle spørringene. Her er den første og den enkleste SQL-spørringa:

SELECT navn, tlf FROM pasient;

SQL-spørringa over henter enkelt og greit navnet og telefonnummeret til alle pasientene. SQL-spørringer avsluttes med semikolon. Resultatet er som følger:

Vi skal nå kikke på en mer avansert spørring hvor vi henter data fra flere tabeller.

SELECT pasient.personnr AS personnr,
       pasient.navn AS navn,
       pasient.adresse AS adresse,
       pasient.postnr AS postnr,
       poststed.poststed AS poststed,
       pasient.tlf AS telefon,
       lege.navn AS lege
  FROM pasient
  INNER JOIN poststed on poststed.postnr = pasient.postnr
  INNER JOIN lege on lege.l_id = pasient.l_id;

Vi tar en stegvis gjennomgang av SQL-spørringa over.

  1. «SELECT pasient.personnr AS personnr,» betyr hent personnummeret til pasienten. I spørringer som dette som involverer flere tabeller (her: pasient, lege og poststed) så spesifiserer man gjerne tabellnavnet for feltet. Altså betyr «pasient.personnr» personnr-feltet fra tabellen pasient. «AS» betyr gi kolonneoverskrifta i utlistingen navnet «personnr».
  2. «pasient.navn AS navn,» er en fortsettelse fra linja før (legg merke til kommaet i slutten av linje 1) og betyr hent navnet til pasienten og kall kolonna «navn».
  3. «pasient.postnr AS postnr,» er postnummeret til pasienten og kall kolonnna «postnr».
  4. «poststed.poststed AS poststed,». Her henter man poststedet fra tabellen «poststed» og kaller kolonna ikke uventet «poststed».
  5. «pasient.tlf AS telefon,» som betyr telefonnummeret til pasienten og kall kolonna «telefon».
  6. «lege.navn AS lege» gir navnet til legen fra tabellen «lege» og kolonneoverskrifta blir «lege».
  7. «FROM pasient» betyr at dataene hentes fra tabellen «pasient».
  8. «INNER JOIN poststed on poststed.postnr = pasient.postnr» betyr at man henter data fra tabellen «poststed» hvor postnummeret (postnr) er likt i tabellene «poststed» og «pasient». Til informasjon så finnes flere typer med «JOINs». «poststed.postnr» er primærnøkkel i tabellen «poststed» og «pasient.postnr» er fremmednøkkel i tabellen «pasient».
  9. «INNER JOIN lege on lege.l_id = pasient.l_id;» henter data fra tabellen «lege» hvor ID-nummeret (l_id) er likt i tabellene «lege» og «pasient». «lege.l_id» er primærnøkkel i tabellen «lege» og «pasient.l_id» er fremmednøkkel i tabellen «pasient». SQL-spørringa avsluttes med et semikolon.

Resultatet som listes ut av spørringa blir slik:

Spørring nummer 3 skal hente ute en adresseliste, som inneholder navn, adresse, postnummer og poststed, for alle pasientene til legen «Petter Olsen».

SELECT pasient.navn AS navn,
       pasient.adresse AS adresse,
       pasient.postnr AS postnr,
       poststed.poststed AS poststed
  FROM pasient
  INNER JOIN poststed on poststed.postnr = pasient.postnr
  INNER JOIN lege on lege.l_id = pasient.l_id
  WHERE lege.navn = 'Petter Olsen';

SQL-spørringa over er ganske lik spørring nummer 2 så jeg går ikke i detalj gjennom hver linje, men den har fått en ny linje på slutten av spørringa. «WHERE lege.navn = ‘Petter Olsen’;» betyr enkelt og greit at spørringa skal begrenses til bare å inneholde pasientene til legen «Petter Olsen».

Legg merke til at navnet til legen ikke er med i utlistinga. Skulle det vært med så måtte man lagt «lege.navn AS lege» til i spørringa før «FROM pasient». Pass på at man har kommaene på rett plass. For de som nå fikk litt panikk så finnes det verktøy med fine grafiske grensesnitt hvor man kan bruke mer eller mindre «dra og slipp»-funksjoner (f.eks. Microsoft Access) for å generere SQL-spørringene.