Riepilogo :in questo tutorial imparerai a conoscere la sottoquery SQLite per costruire query più leggibili e complesse.
Introduzione alla sottoquery SQLite
Una sottoquery è un SELECT
istruzione annidata in un'altra istruzione. Vedi la seguente dichiarazione.
SELECT column_1
FROM table_1
WHERE column_1 = (
SELECT column_1
FROM table_2
);
Code language: SQL (Structured Query Language) (sql)
La query seguente è la query esterna :
SELECT column_1
FROM table_1
WHERE colum_1 =
Code language: SQL (Structured Query Language) (sql)
E la query seguente è la sottoquery .
(SELECT column_1
FROM table_2)
Code language: SQL (Structured Query Language) (sql)
È necessario utilizzare una coppia di parentesi per racchiudere una sottoquery. Tieni presente che puoi annidare una sottoquery all'interno di un'altra sottoquery con una certa profondità.
In genere, una sottoquery restituisce una singola riga come valore atomico, sebbene possa restituire più righe per confrontare i valori con IN
operatore.
Puoi usare una sottoquery in SELECT
, FROM
, WHERE
e JOIN
clausole.
Esempi di sottoquery SQLite
Useremo le tracks
e albums
tabelle dal database di esempio per la dimostrazione.
1) Sottoquery SQLite nel WHERE
esempio di clausola
È possibile utilizzare una semplice sottoquery come condizione di ricerca. Ad esempio, la seguente istruzione restituisce tutti i brani dell'album con il titolo 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)
La sottoquery restituisce l'ID dell'album con il titolo 'Let There Be Rock'
. La query utilizza l'operatore uguale (=) per confrontare albumid
restituito dalla sottoquery con albumid
nei tracks
tabella.
Se la sottoquery restituisce più valori, puoi utilizzare IN
operatore per verificare l'esistenza di un singolo valore rispetto a un insieme di valori.
Vedi i seguenti employees
e customers
tabella nel database di esempio:
Ad esempio, la query seguente restituisce i clienti i cui rappresentanti di vendita si trovano in Canada.
SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);
Code language: SQL (Structured Query Language) (sql)
La sottoquery restituisce un elenco di ID dei dipendenti che si trovano in Canada. La query esterna utilizza IN
operatore per trovare i clienti che hanno l'ID rappresentante di vendita nell'elenco.
2) Sottoquery SQLite nel FROM
esempio di clausola
A volte si desidera applicare più volte funzioni aggregate a una colonna. Ad esempio, prima vuoi sommare le dimensioni di un album e poi calcolare la dimensione media di tutti gli album. Potresti venire con la seguente domanda.
SELECT AVG(SUM(bytes)
FROM tracks
GROUP BY albumid;
Code language: SQL (Structured Query Language) (sql)
Questa query non è valida.
Per risolverlo, puoi usare una sottoquery nel FROM
clausola come segue:
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
In questo caso, SQLite esegue prima la sottoquery nel FROM
clausola e restituisce un set di risultati. Quindi, SQLite utilizza questo set di risultati come tabella derivata nella query esterna.
Subquery correlata a SQLite
Tutte le sottoquery che hai visto finora possono essere eseguite in modo indipendente. In altre parole, non dipende dalla query esterna.
La sottoquery correlata è una sottoquery che utilizza i valori della query esterna. A differenza di una sottoquery ordinale, una sottoquery correlata non può essere eseguita in modo indipendente.
La sottoquery correlata non è efficiente perché viene valutata per ogni riga elaborata dalla query esterna.
La query seguente utilizza una sottoquery correlata per restituire gli album la cui dimensione è inferiore a 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)
Come funziona la query.
- Per ogni riga elaborata nella query esterna, la sottoquery correlata calcola la dimensione degli album dai brani che appartengono all'album corrente utilizzando il
SUM
funzione. - Il predicato nel
WHERE
la clausola filtra gli album che hanno una dimensione maggiore o uguale a 10 MB (10000000 byte).
Subquery correlata a SQLite in SELECT
esempio di clausola
La query seguente utilizza una sottoquery correlata in SELECT
clausola per restituire il numero di tracce in un 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)
In questo tutorial, ti abbiamo presentato la sottoquery e mostrato vari modi per utilizzare una sottoquery in una query per selezionare i dati dalle tabelle.