Delspørring

Fra Wikipedia, den frie encyklopedi

En delspørring[1][2][3] 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]