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