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
SUMfunktion. - Predikatet i
WHEREklausul 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.