SQLite: sottoquery
Una sottoquery, una query interna o una query annidata è una query all'interno di un'altra query SQLite e incorporata nella clausola WHERE.
Una sottoquery viene utilizzata per restituire i dati che verranno utilizzati nella query principale come condizione per limitare ulteriormente i dati da recuperare.
Le sottoquery possono essere utilizzate con le istruzioni SELECT, INSERT, UPDATE e DELETE insieme agli operatori come =, <,>,> =, <=, IN, BETWEEN, ecc.
Ci sono alcune regole che le sottoquery devono seguire:
Le sottoquery devono essere racchiuse tra parentesi.
Una sottoquery può avere solo una colonna nella clausola SELECT, a meno che non siano presenti più colonne nella query principale per la sottoquery per confrontare le colonne selezionate.
Un ORDER BY non può essere utilizzato in una sottoquery, sebbene la query principale possa utilizzare un ORDER BY. GROUP BY può essere utilizzato per eseguire la stessa funzione di ORDER BY in una sottoquery.
Le sottoquery che restituiscono più di una riga possono essere utilizzate solo con più operatori di valore, come l'operatore IN.
L'operatore BETWEEN non può essere utilizzato con una sottoquery; tuttavia, BETWEEN può essere utilizzato all'interno della sottoquery.
Sottoquery con istruzione SELECT
Le sottoquery vengono utilizzate più di frequente con l'istruzione SELECT. La sintassi di base è la seguente:
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
Esempio
Considera la tabella AZIENDA con i seguenti record.
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
Ora, controlliamo la seguente sottoquery con l'istruzione SELECT.
sqlite> SELECT *
FROM COMPANY
WHERE ID IN (SELECT ID
FROM COMPANY
WHERE SALARY > 45000) ;
Questo produrrà il seguente risultato.
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 85000.0
Sottoquery con istruzione INSERT
Le sottoquery possono essere utilizzate anche con le istruzioni INSERT. L'istruzione INSERT utilizza i dati restituiti dalla sottoquery per inserirli in un'altra tabella. I dati selezionati nella sottoquery possono essere modificati con qualsiasi funzione di carattere, data o numero.
Di seguito è la sintassi di base è la seguente:
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
Esempio
Si consideri una tabella COMPANY_BKP con struttura simile alla tabella COMPANY e può essere creata utilizzando la stessa CREATE TABLE utilizzando COMPANY_BKP come nome della tabella. Per copiare la tabella COMPANY completa in COMPANY_BKP, la seguente è la sintassi:
sqlite> INSERT INTO COMPANY_BKP
SELECT * FROM COMPANY
WHERE ID IN (SELECT ID
FROM COMPANY) ;
Sottoquery con istruzione UPDATE
La sottoquery può essere utilizzata insieme all'istruzione UPDATE. È possibile aggiornare una o più colonne in una tabella quando si utilizza una sottoquery con l'istruzione UPDATE.
Di seguito è la sintassi di base è la seguente:
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Esempio
Supponendo che sia disponibile la tabella COMPANY_BKP che è un backup della tabella COMPANY.
L'esempio seguente aggiorna lo SALARIO di 0,50 volte nella tabella AZIENDA per tutti i clienti, la cui ETÀ è maggiore o uguale a 27.
sqlite> UPDATE COMPANY
SET SALARY = SALARY * 0.50
WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
WHERE AGE >= 27 );
Ciò avrebbe un impatto su due righe e alla fine la tabella AZIENDA avrebbe i seguenti record:
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 10000.0
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 42500.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0
Sottoquery con istruzione DELETE
La sottoquery può essere utilizzata insieme all'istruzione DELETE come con qualsiasi altra istruzione menzionata sopra.
Di seguito è la sintassi di base è la seguente:
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Esempio
Supponendo che sia disponibile la tabella COMPANY_BKP che è un backup della tabella COMPANY.
L'esempio seguente elimina i record dalla tabella AZIENDA per tutti i clienti la cui ETÀ è maggiore o uguale a 27.
sqlite> DELETE FROM COMPANY
WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
WHERE AGE > 27 );
Ciò influirà su due righe e alla fine la tabella AZIENDA avrà i seguenti record:
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
2 Allen 25 Texas 15000.0
3 Teddy 23 Norway 20000.0
4 Mark 25 Rich-Mond 65000.0
5 David 27 Texas 42500.0
6 Kim 22 South-Hall 45000.0
7 James 24 Houston 10000.0