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

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

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

  • 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

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

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

  1. ^ «Avansert bruk av SQL, delspørringer, vekselvirkende delspørringer». 
  2. ^ «IN2090 – Databaser og datamodellering 05 – Nestede spørringer» (PDF). 
  3. ^ «IN2090 – Databaser og datamodellering 06 – Enkele joins og nestede SELECT» (PDF). 
  4. ^ WilliamDAssafMSFT (3. mars 2023). «Subqueries (SQL Server) - SQL Server». learn.microsoft.com (engelsk). Besøkt 19. mai 2023. 
  5. ^ «9.23. Subquery Expressions». PostgreSQL Documentation (engelsk). 11. mai 2023. Besøkt 19. mai 2023. 
  6. ^ «MySQL :: MySQL 8.0 Reference Manual :: 13.2.15 Subqueries». dev.mysql.com. Besøkt 19. mai 2023. 
  7. ^ «Oracle Live SQL - Tutorial: Subqueries: Databases for Developers». 
  8. ^ «SyBooks Online». infocenter.sybase.com. Besøkt 19. mai 2023. 
  9. ^ «Arbeidsnotater fra Høgskolen i Buskerud nr.71 - Praktisk database-administrasjon med persistens av objektorienterte systemer - Kompendium - Knut W. Hansson» (PDF). 
  10. ^ 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. 
  11. ^ «TDT4150 Avanserte databasesystemer, eksamensoppgave 2016 juni» (PDF). 
  12. ^ «PostgreSQL 7.4 lansert». Tek.no (norsk). 19. november 2003. Besøkt 19. mai 2023. 
  13. ^ «MySQL, IT 1, del 2, Per G. Østerlie» (PDF). 
  14. ^ «Repetisjonsforelesning, SQL og utover, V18, Evgenij Thorstensen» (PDF).