Delspørring

En **delspørring** (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, 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:
```sql
SELECT field_list FROM table_name
WHERE field_name1 = (SELECT field_name2 FROM table_name2 WHERE condition)
```
Følgende delspørring returnerer flere verdier:
```sql
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:
```sql
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:

```sql
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:

```sql
SELECT stName
  FROM Students
  WHERE (SELECT AVG(mark)
      FROM Marks
      WHERE Marks.stNum = Students.stNum) > 4.5
```


## Referanser