sql >> Databasteknik >  >> RDS >> SQLite

SQLite Subquery

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.


  1. ST_HexagonGrid geomvektor för att hitta alla punkter

  2. Hur man frågar jsonb-arrayer med IN-operator

  3. Återställa en postgres backup-fil med kommandoraden?

  4. Skapa underhållsplaner i SQL Server