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

Kategori:SQL