PostgreSQL - Query secondarie

Una sottoquery, una query interna o una query annidata è una query all'interno di un'altra query PostgreSQL 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 a operatori come =, <,>,> =, <=, IN, 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, EXISTS, NOT IN, ANY / SOME, ALL.

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

Sottoquery con l'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
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

Ora, controlliamo la seguente sottoquery con l'istruzione SELECT:

testdb=# SELECT *
   FROM COMPANY
   WHERE ID IN (SELECT ID
      FROM COMPANY
      WHERE SALARY > 45000) ;

Ciò produrrebbe il seguente risultato:

id | name  | age |  address    | salary
----+-------+-----+-------------+--------
  4 | Mark  |  25 | Rich-Mond   |  65000
  5 | David |  27 | Texas       |  85000
(2 rows)

Sottoquery con l'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.

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. Ora, per copiare la tabella COMPANY completa in COMPANY_BKP, la seguente è la sintassi:

testdb=# INSERT INTO COMPANY_BKP
   SELECT * FROM COMPANY
   WHERE ID IN (SELECT ID
      FROM COMPANY) ;

Sottoquery con l'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.

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 è il backup della tabella COMPANY.

Il seguente esempio aggiorna lo SALARIO di 0,50 volte nella tabella AZIENDA per tutti i clienti, la cui ETÀ è maggiore o uguale a 27 -

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

Ciò influirà su due righe e alla fine la tabella AZIENDA avrebbe i seguenti record:

id | name  | age | address     | salary
----+-------+-----+-------------+--------
  2 | Allen |  25 | Texas       |  15000
  3 | Teddy |  23 | Norway      |  20000
  4 | Mark  |  25 | Rich-Mond   |  65000
  6 | Kim   |  22 | South-Hall  |  45000
  7 | James |  24 | Houston     |  10000
  1 | Paul  |  32 | California  |  10000
  5 | David |  27 | Texas       |  42500
(7 rows)

Sottoquery con l'istruzione DELETE

La sottoquery può essere utilizzata insieme all'istruzione DELETE come con qualsiasi altra istruzione menzionata sopra.

La sintassi di base è la seguente:

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

Esempio

Supponendo di avere a disposizione 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 -

testdb=# 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 avrebbe i seguenti record:

id | name  | age | address     | salary
----+-------+-----+-------------+--------
  2 | Allen |  25 | Texas       |  15000
  3 | Teddy |  23 | Norway      |  20000
  4 | Mark  |  25 | Rich-Mond   |  65000
  6 | Kim   |  22 | South-Hall  |  45000
  7 | James |  24 | Houston     |  10000
  5 | David |  27 | Texas       |  42500
(6 rows)