Delspørring
En delspørring[1][2][3] (engelsk: subselect eller subquery) er en spørring i en database som er plassert inni en ytre spørring, og resultatene fra den indre spørringen brukes i en eller annen form i den ytre spørringen. Delspørringer brukes vanligvis for å hente data fra to eller flere tabeller, samt som en betingelse for å begrense mottatte data som returneres for å bli brukt i hovedspørringen. De brukes der det ikke er hensiktsmessig eller mulig å bruke aggregeringsfunksjoner eller (for kompatibilitet) lagrede prosedyrer.
Delspørringer brukes i SQL innenfor en WHERE- eller HAVING-klausul til en ytre SQL-spørring. En delspørring er oftest en SELECT-kommando («sub-select»), og gir verdier til sammenligningsbetingelsen (WHERE-klausulen) for foreldrespørringen (svært sjelden andre deler av spørringen). De fleste etablerte databasesystemer støtter delspørringer, inkludert Microsoft SQL Server,[4] PostgreSQL,[5] MySQL[6] (fra versjon 4.1), Oracle[7] og Sybase.[8]
Delspørringer kan også brukes i FROM-klausulen, men må da gis et alias. Delspørringer kan også brukes i SELECT-klausulen, men må da bare returnere én verdi og for én kolonne, og denne verdien vil da komme i alle rader i resultattabellen.
En delspørring kan også kalles en nøstet spørring[9][10][11] (noen ganger kalt underspørring,[12] indre spørring[10][13][14] eller nestet spørring).
Typer delspørringer
[rediger | rediger kilde]Delspørringer kan deles i tre typer:
- Enkel delspørring som returnerer én enkelt verdi
- Enkel delspørring som returnerer flere verdier
- Korrelert delspørring, en delspørring som inneholder en referanse til kolonnene i den eksterne spørringstabellen
Behandling av delspørringer
[rediger | rediger kilde]Enkle delspørringer behandles av systemet nedenfra og opp, altså at delspørringen på det laveste nivået behandles først. Mengden av verdier som returneres av delspørringen brukes så i spørringen på nivået over.
Korrelerte delspørringer behandles av systemet i omvendt rekkefølge (den ytre spørringen må behandles først siden den brukes i den indre). Først velges den første raden i tabellen generert av hovedspørringen, og fra denne velges verdiene til de kolonnene som brukes i delspørringen. Dersom disse verdiene tilfredsstiller betingelsene for den nøstede delspørringen blir den valgte raden inkludert i resultatet. Deretter velges andre rad, og så videre, inntil alle rader som tilfredsstiller delspørringen (eller sekvensene av nøstede delspørringer) er inkludert i resultatet.
Egenskaper av delspørringer
[rediger | rediger kilde]- En delspørring er alltid omsluttet av parenteser
- Resultattabellen for en delspørring har alltid én kolonne
- ORDER BY-klausulen kan ikke inkluderes i en delspørring
- En delspørring kan ikke ende i en funksjon
- Delspørringer som returnerer mer enn én oppføring kan brukes med flere verdioperatorer, for eksempel IN-operatoren
- BETWEEN-operatoren kan ikke brukes sammen med en delspørring.
- Delspørringer som tester for eksistensen eller tilstedeværelsen av data begynner med EXISTS
Syntaks
[rediger | rediger kilde]Følgende delspørring returnerer en enkelt verdi:
SELECT field_list FROM table_name
WHERE field_name1 = (SELECT field_name2 FROM table_name2 WHERE condition)
Følgende delspørring returnerer flere verdier:
SELECT field_list FROM table_name
WHERE field_name1 IN (SELECT field_name2 FROM table_name2 WHERE condition)
Følgende er en korrelert delspørring:
SELECT field_list FROM table_name
WHERE field_name_1 IN (SELECT field_name2 FROM table_name2 WHERE tale_name1.field=table_name2.field)
Eksempler
[rediger | rediger kilde]Eksempel 1: Følgende spørring returnerer en liste over fag hvor karakteren 4 ble oppnådd:
SELECT subjName
FROM Subjects
WHERE subjNum IN ( SELECT subjNum
FROM Marks
WHERE mark = 4)
Eksempel 2: Følgende spørring returnerer en liste over studenter som hadde over 4.5 i gjennomsnittskarakter:
SELECT stName
FROM Students
WHERE (SELECT AVG(mark)
FROM Marks
WHERE Marks.stNum = Students.stNum) > 4.5
Referanser
[rediger | rediger kilde]- ^ «Avansert bruk av SQL, delspørringer, vekselvirkende delspørringer».
- ^ «IN2090 – Databaser og datamodellering 05 – Nestede spørringer» (PDF).
- ^ «IN2090 – Databaser og datamodellering 06 – Enkele joins og nestede SELECT» (PDF).
- ^ WilliamDAssafMSFT (3. mars 2023). «Subqueries (SQL Server) - SQL Server». learn.microsoft.com (på engelsk). Besøkt 19. mai 2023.
- ^ «9.23. Subquery Expressions». PostgreSQL Documentation (på engelsk). 11. mai 2023. Besøkt 19. mai 2023.
- ^ «MySQL :: MySQL 8.0 Reference Manual :: 13.2.15 Subqueries». dev.mysql.com. Besøkt 19. mai 2023.
- ^ «Oracle Live SQL - Tutorial: Subqueries: Databases for Developers».
- ^ «SyBooks Online». infocenter.sybase.com. Besøkt 19. mai 2023.
- ^ «Arbeidsnotater fra Høgskolen i Buskerud nr.71 - Praktisk database-administrasjon med persistens av objektorienterte systemer - Kompendium - Knut W. Hansson» (PDF).
- ^ a b «Kompendium TDT4145 Datamodellering og Database, 2019 vår – Mathilde Haukø Haugum» (PDF). Arkivert fra originalen (PDF) 26. september 2022. Besøkt 19. mai 2023.
- ^ «TDT4150 Avanserte databasesystemer, eksamensoppgave 2016 juni» (PDF).
- ^ «PostgreSQL 7.4 lansert». Tek.no (på norsk). 19. november 2003. Besøkt 19. mai 2023.
- ^ «MySQL, IT 1, del 2, Per G. Østerlie» (PDF).
- ^ «Repetisjonsforelesning, SQL og utover, V18, Evgenij Thorstensen» (PDF).