En **delspørring** 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, PostgreSQL, MySQL (fra versjon 4.1), Oracle og Sybase.

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** (noen ganger kalt *underspørring*, *indre spørring* 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. 1 2  «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).