Oversigt :i dette selvstudie lærer du om SQLite-underforespørgslen for at konstruere mere læsbare og komplekse forespørgsler.
Introduktion til SQLite-underforespørgsel
En underforespørgsel er en SELECT
sætning indlejret i en anden erklæring. Se følgende erklæring.
SELECT column_1
FROM table_1
WHERE column_1 = (
SELECT column_1
FROM table_2
);
Code language: SQL (Structured Query Language) (sql)
Følgende forespørgsel er den ydre forespørgsel :
SELECT column_1
FROM table_1
WHERE colum_1 =
Code language: SQL (Structured Query Language) (sql)
Og den følgende forespørgsel er underforespørgslen .
(SELECT column_1
FROM table_2)
Code language: SQL (Structured Query Language) (sql)
Du skal bruge et par parenteser for at omslutte en underforespørgsel. Bemærk, at du kan indlejre en underforespørgsel i en anden underforespørgsel med en vis dybde.
Typisk returnerer en underforespørgsel en enkelt række som en atomværdi, selvom den kan returnere flere rækker for at sammenligne værdier med IN
operatør.
Du kan bruge en underforespørgsel i SELECT
, FROM
, WHERE
, og JOIN
klausuler.
Eksempler på SQLite-underforespørgsler
Vi vil bruge tracks
og albums
tabeller fra prøvedatabasen til demonstrationen.
1) SQLite-underforespørgsel i WHERE
klausuleksempel
Du kan bruge en simpel underforespørgsel som en søgebetingelse. For eksempel returnerer følgende sætning alle numrene i albummet med titlen Let There Be Rock
SELECT trackid,
name,
albumid
FROM tracks
WHERE albumid = (
SELECT albumid
FROM albums
WHERE title = 'Let There Be Rock'
);
Code language: SQL (Structured Query Language) (sql)
Underforespørgslen returnerer albummets id med titlen 'Let There Be Rock'
. Forespørgslen bruger lige-operatoren (=) til at sammenligne albumid
returneres af underforespørgslen med albumid
i tracks
tabel.
Hvis underforespørgslen returnerer flere værdier, kan du bruge IN
operatør for at kontrollere, om der findes en enkelt værdi i forhold til et værdisæt.
Se følgende employees
og customers
tabel i eksempeldatabasen:
For eksempel returnerer følgende forespørgsel de kunder, hvis salgsrepræsentanter er i Canada.
SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);
Code language: SQL (Structured Query Language) (sql)
Underforespørgslen returnerer en liste over id'er for de medarbejdere, der befinder sig i Canada. Den ydre forespørgsel bruger IN
operatør for at finde de kunder, der har salgsrepræsentant-id'et på listen.
2) SQLite-underforespørgsel i FROM
klausuleksempel
Nogle gange vil du anvende aggregerede funktioner til en kolonne flere gange. For eksempel vil du først summere størrelsen af et album og derefter beregne den gennemsnitlige størrelse af alle albums. Du kan komme med følgende forespørgsel.
SELECT AVG(SUM(bytes)
FROM tracks
GROUP BY albumid;
Code language: SQL (Structured Query Language) (sql)
Denne forespørgsel er ikke gyldig.
For at rette det, kan du bruge en underforespørgsel i FROM
klausul som følger:
SELECT
AVG(album.size)
FROM
(
SELECT
SUM(bytes) SIZE
FROM
tracks
GROUP BY
albumid
) AS album;
Code language: SQL (Structured Query Language) (sql)
AVG(album.size) --------------- 338288920.317
I dette tilfælde udfører SQLite først underforespørgslen i FROM
klausul og returnerer et resultatsæt. Derefter bruger SQLite dette resultatsæt som en afledt tabel i den ydre forespørgsel.
SQLite-korreleret underforespørgsel
Alle de underforespørgsler, du har set indtil videre, kan udføres uafhængigt. Med andre ord afhænger det ikke af den ydre forespørgsel.
Den korrelerede underforespørgsel er en underforespørgsel, der bruger værdierne fra den ydre forespørgsel. I modsætning til en ordinær underforespørgsel kan en korreleret underforespørgsel ikke udføres uafhængigt.
Den korrelerede underforespørgsel er ikke effektiv, fordi den evalueres for hver række, der behandles af den ydre forespørgsel.
Følgende forespørgsel bruger en korreleret underforespørgsel til at returnere de album, hvis størrelse er mindre end 10 MB.
SELECT albumid,
title
FROM albums
WHERE 10000000 > (
SELECT sum(bytes)
FROM tracks
WHERE tracks.AlbumId = albums.AlbumId
)
ORDER BY title;
Code language: SQL (Structured Query Language) (sql)
Sådan fungerer forespørgslen.
- For hver række, der behandles i den ydre forespørgsel, beregner den korrelerede underforespørgsel størrelsen af albummene ud fra de spor, der tilhører det aktuelle album ved hjælp af
SUM
funktion. - Prdikatet i
WHERE
klausul filtrerer de album, der har en størrelse større end eller lig med 10 MB (10000000 bytes).
SQLite-korreleret underforespørgsel i SELECT
klausuleksempel
Følgende forespørgsel bruger en korreleret underforespørgsel i SELECT
klausul for at returnere antallet af spor i et album.
SELECT albumid,
title,
(
SELECT count(trackid)
FROM tracks
WHERE tracks.AlbumId = albums.AlbumId
)
tracks_count
FROM albums
ORDER BY tracks_count DESC;
Code language: SQL (Structured Query Language) (sql)
I denne øvelse har vi introduceret dig til underforespørgslen og vist forskellige måder at bruge en underforespørgsel i en forespørgsel til at vælge data fra tabeller.