SQLite
 sql >> Database >  >> RDS >> SQLite

Sottoquery SQLite

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.