Spørringer mot tabeller i SQL



Spørringer mot tabeller i SQL

av Ole Petter den 17. desember 2019

Sist oppdatert: 30 desember, 2019 kl 05:36

En tabell i SQL er laget i en todimensjonal datastruktur. Vertikalt er den delt inn i kolonner, som inneholder ulike datatyper som tekst, tall, karakterer og lignende. Horisontalt er den delt opp i rader. I en bestemt kolonne som krysses med en rad er det en spesifikk verdi, for eksempel et tall.

Eksempel på tabelldata
Eksempel på en tabell i MySQL. Kilde: mysqltutorial.org

Contents

Grunnleggende spørringer

Alle tabeller skal ha en primærnøkkel som er unik for hver rad. I eksempelet over er primærnøkkelen employeeNumber.

Hvis man skal spørre mot kun en tabell kan man gjøre det ganske kjapt og enkelt:

/* Den enkleste spørringen */
"SELECT * FROM employees";

Problemet med slike generelle spørringer er at hvis man gjør en slik generell spørring mot to eller flere tabeller, får man fort veldig mye data i retur, gjerne tusenvis av rader.

/* Spørring mot to tabeller */
"SELECT * FROM employees A, offices B";

Spørringen ovenfor vil returnere alle radene i employees-tabellen multiplisert med antall rader i offices-tabellen. Resultatet man oppnår ved en slik spørring kalles et kryssprodukt. Hvis man har 100 rader i den første tabellen, og 50 tabeller i den andre, vil man få 100*50 resultater, altså 5,000 rader.

Oversikt over to tabeller
Viser spørring mot tabellene employees og offices uten filtrering

Mer avanserte spørringer med join

Hvis man har en kolonne i employees-tabellen hvor man har en fremmednøkkel mot offices-tabellen, kan man få spesifikke resultater og unngå redundans, eller overflødige rader.

I dette eksempelet er officeId primærnøkkel i offices-tabellen, og fremmednøkkel i employees-tabellen.

/* Spørringer mot to tabeller med JOIN */
"SELECT * FROM employees A
JOIN offices B 
ON B.officeId = A.officeId";
Spørring i phpmyadmin
Ved bruk av JOIN vises kun de relevante radene for tabellene, altså en rad for hver ansatt.

En alternativ måte å oppnå samme resultat på er å spesifisere hvilken eller hvilke kolonner i den ene tabellen som er fremmednøkkel i den andre og omvendt:

"SELECT * FROM employees A, offices B WHERE A.officeId = B.id";

For å enklere skille de to tabellene brukes et såkalt alias for tabellene, altså employees A, og offices B. Så slipper man å skrive hele tabellnavnet for så å skrive kolonnenavnet når man skal fortelle hvilken kolonne man skal flette sammen i de ulike tabellene.

En alternativ måte uten alias hadde vært å skrive «employees.officeId = offices.id», men med A som alias for employees og B som alias for offices kan man bruke aliaset for tabellen i stedet for hele tabellnavnet.

1 Kommentarer
Avanserte spørringer i SQL - Blogg

[…] to kolonnene i forrige eksempel var unionskompatible siden de hadde samme verdi, altså officeId i employees-tabellen, og id i […]

Legg igjen en kommentar