Delspørring

en databasespørring innenfor en annen spø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

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

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

  • 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

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

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