Sammanfattning :i den här handledningen kommer du att lära dig om SQLite-underfrågan för att skapa mer läsbara och komplexa frågor.
Introduktion till SQLite-underfrågan
En underfråga är en SELECT
uttalande kapslat i ett annat uttalande. Se följande uttalande.
SELECT column_1
FROM table_1
WHERE column_1 = (
SELECT column_1
FROM table_2
);
Code language: SQL (Structured Query Language) (sql)
Följande fråga är den yttre frågan :
SELECT column_1
FROM table_1
WHERE colum_1 =
Code language: SQL (Structured Query Language) (sql)
Och följande fråga är underfrågan .
(SELECT column_1
FROM table_2)
Code language: SQL (Structured Query Language) (sql)
Du måste använda ett par parenteser för att omsluta en underfråga. Observera att du kan kapsla en underfråga i en annan underfråga med ett visst djup.
Vanligtvis returnerar en underfråga en enskild rad som ett atomvärde, även om den kan returnera flera rader för att jämföra värden med IN
operatör.
Du kan använda en underfråga i SELECT
, FROM
, WHERE
och JOIN
klausuler.
Exempel på SQLite-underfrågor
Vi kommer att använda tracks
och albums
tabeller från exempeldatabasen för demonstrationen.
1) SQLite-underfrågan i WHERE
klausulexempel
Du kan använda en enkel underfråga som sökvillkor. Till exempel returnerar följande sats alla spår i albumet med titeln 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)
Underfrågan returnerar albumets id med titeln 'Let There Be Rock'
. Frågan använder lika-operatorn (=) för att jämföra albumid
returneras av underfrågan med albumid
i tracks
bord.
Om underfrågan returnerar flera värden kan du använda IN
operatör för att kontrollera förekomsten av ett enda värde mot en uppsättning värde.
Se följande employees
och customers
tabell i exempeldatabasen:
Till exempel returnerar följande fråga de kunder vars säljare finns i Kanada.
SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);
Code language: SQL (Structured Query Language) (sql)
Underfrågan returnerar en lista med ID för de anställda som befinner sig i Kanada. Den yttre frågan använder IN
operatör för att hitta de kunder som har säljarens ID i listan.
2) SQLite-underfråga i FROM
klausulexempel
Ibland vill du använda aggregerade funktioner på en kolumn flera gånger. Till exempel vill du först summera storleken på ett album och sedan beräkna medelstorleken för alla album. Du kan komma med följande fråga.
SELECT AVG(SUM(bytes)
FROM tracks
GROUP BY albumid;
Code language: SQL (Structured Query Language) (sql)
Den här frågan är inte giltig.
För att fixa det kan du använda en underfråga i FROM
klausul enligt följande:
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 det här fallet exekverar SQLite först underfrågan i FROM
klausul och returnerar en resultatuppsättning. Sedan använder SQLite denna resultatuppsättning som en härledd tabell i den yttre frågan.
SQLite-korrelerad underfråga
Alla underfrågor du har sett hittills kan köras oberoende. Med andra ord, det beror inte på den yttre frågan.
Den korrelerade underfrågan är en underfråga som använder värdena från den yttre frågan. Till skillnad från en ordinal underfråga kan en korrelerad underfråga inte köras oberoende.
Den korrelerade underfrågan är inte effektiv eftersom den utvärderas för varje rad som bearbetas av den yttre frågan.
Följande fråga använder en korrelerad underfråga för att returnera album vars storlek är mindre än 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)
Hur frågan fungerar.
- För varje rad som bearbetas i den yttre frågan, beräknar den korrelerade underfrågan storleken på albumen från spåren som tillhör det aktuella albumet med hjälp av
SUM
funktion. - Predikatet i
WHERE
klausul filtrerar album som har en storlek större än eller lika med 10 MB (10000000 byte).
SQLite-korrelerad underfråga i SELECT
klausulexempel
Följande fråga använder en korrelerad underfråga i SELECT
klausul för att returnera antalet spår i ett 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 den här handledningen har vi introducerat dig till underfrågan och visat olika sätt att använda en underfråga i en fråga för att välja data från tabeller.