English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQLite 子查询

La sottosquisita, la query interna o la query annidata è una query SQLite inserita in un'altra query e inclusa nel sottoinsieme WHERE.

La sottosquisita viene utilizzata per restituire i dati che verranno utilizzati nella query principale, come condizioni per ulteriori limitazioni dei dati da recuperare.

La sottosquisita può essere utilizzata con le istruzioni SELECT, INSERT, UPDATE e DELETE, nonché con gli operatori =, <, >, >=, <=, IN, BETWEEN e altri.

Esistono alcune regole da seguire per le sottoquery-

  • Le sottoquery devono essere inserite tra parentesi tonde.

  • All'interno di una sottoquery è possibile avere solo una colonna, a meno che lo statement principale non fornisca più colonne per confrontare le colonne selezionate dalla sottoquery.

  • Nonostante lo statement principale possa utilizzare ORDER BY, non può essere utilizzato all'interno di una sottoquery. GROUP BY può essere utilizzato per eseguire la stessa funzione di ORDER BY nella sottoquery.

  • Le sottoquery che restituiscono più righe possono essere utilizzate con operatori di valore multipli (ad esempio, l'operatore IN).

  • L'operatore BETWEEN non può essere utilizzato con le sottoquery; tuttavia, può essere utilizzato all'interno di una sottoquery.

Sottoquery con statement SELECT

Le sottoquery vengono utilizzate più frequentemente con gli statement 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

La tabella COMPANY 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
5 James 24 Houston 10000.0

Ora, esaminiamo la sottoquery utilizzando lo statement SELECT.

sqlite> SELECT * 
   FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY 
      WHERE SALARY > 45000);

Questo produrrà i seguenti risultati.

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5 David 27 Texas 85000.0

Sottoquery con statement INSERT

Le sottoquery possono essere utilizzate insieme agli statement INSERT. Gli statement INSERT utilizzano i dati restituiti dalla sottoquery per inserire altri dati in un'altra tabella. È possibile utilizzare qualsiasi funzione di caratteri, date o numeri per modificare i dati selezionati nella sottoquery.

Ecco la sintassi di base come segue-

INSERT INTO table_name [ (column1 [, column2 ])
   SELECT [ * | column1 [, column2 ]
   FROM table1 [, table2 ]
   [ WHERE VALUE OPERATOR ]

Esempio

Considerare una tabella COMPANY_BKP, la cui struttura è simile a quella della tabella COMPANY e può essere utilizzata come nome della tabella utilizzando lo stesso CREATE TABLE. Per copiare l'intera tabella COMPANY in COMPANY_BKP, utilizzare la seguente sintassi -

sqlite> INSERT INTO COMPANY_BKP
   SELECT * FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY) ;

Sottoquery con UPDATE statement

Le sottoquery possono essere combinate con l'UPDATE statement. Quando si utilizza una sottoquery con l'UPDATE statement, è possibile aggiornare una singola colonna o più colonne nella tabella.

Ecco la sintassi di base come segue-

UPDATE tableSET column_name = new_value[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
      FROM TABLE_NAME)
   [ WHERE) ]

Esempio

Supponiamo di avere la tabella COMPANY_BKP disponibile, che è una copia di backup della tabella COMPANY.

Esempio seguente che aggiorna il salario di tutti i clienti con età maggiore o uguale a 27 nella tabella COMPANY di 0.50 volte.

sqlite> UPDATE COMPANY
   SET SALARY = SALARY * 0.50
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
      WHERE AGE >= 27 );

Questo influenzerà due righe, infine la tabella COMPANY avrà 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
7 David 27 Texas 42500.0
6 Kim 22 South-Hall 45000.0
5 James 24 Houston 10000.0

Sottoquery con DELETE statement

Le sottoquery possono essere utilizzate insieme a DELETE statement, come qualsiasi altro statement menzionato sopra.

Ecco la sintassi di base come segue-

DELETE FROM TABLE_NAME[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
      FROM TABLE_NAME)
   [ WHERE) ]

Esempio

Supponiamo di avere la tabella COMPANY_BKP disponibile, che è una copia di backup della tabella COMPANY.

Esempio seguente che elimina tutti i record dei clienti con età maggiore o uguale a 27 dall'elenco nella tabella COMPANY.

sqlite> DELETE FROM COMPANY
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
   WHERE AGE > 27 );

Questo influenzerà due righe, infine la tabella COMPANY 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
7 David 27 Texas 42500.0
6 Kim 22 South-Hall 45000.0
5 James 24 Houston 10000.0