PostgreSQL - Sous-requêtes

Une sous-requête ou une requête interne ou une requête imbriquée est une requête dans une autre requête PostgreSQL et intégrée dans la clause WHERE.

Une sous-requête est utilisée pour renvoyer des données qui seront utilisées dans la requête principale comme condition pour restreindre davantage les données à récupérer.

Les sous-requêtes peuvent être utilisées avec les instructions SELECT, INSERT, UPDATE et DELETE avec les opérateurs comme =, <,>,> =, <=, IN, etc.

Il y a quelques règles que les sous-requêtes doivent suivre -

  • Les sous-requêtes doivent être placées entre parenthèses.

  • Une sous-requête ne peut avoir qu'une seule colonne dans la clause SELECT, sauf si plusieurs colonnes se trouvent dans la requête principale pour que la sous-requête compare ses colonnes sélectionnées.

  • Un ORDER BY ne peut pas être utilisé dans une sous-requête, bien que la requête principale puisse utiliser un ORDER BY. Le GROUP BY peut être utilisé pour exécuter la même fonction que ORDER BY dans une sous-requête.

  • Les sous-requêtes qui renvoient plusieurs lignes ne peuvent être utilisées qu'avec plusieurs opérateurs de valeur, tels que l'opérateur IN, EXISTS, NOT IN, ANY / SOME, ALL.

  • L'opérateur BETWEEN ne peut pas être utilisé avec une sous-requête; cependant, BETWEEN peut être utilisé dans la sous-requête.

Sous-requêtes avec l'instruction SELECT

Les sous-requêtes sont le plus souvent utilisées avec l'instruction SELECT. La syntaxe de base est la suivante -

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
      (SELECT column_name [, column_name ]
      FROM table1 [, table2 ]
      [WHERE])

Exemple

Considérez que la table COMPANY contient les enregistrements suivants -

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)

Maintenant, vérifions la sous-requête suivante avec l'instruction SELECT -

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

Cela produirait le résultat suivant -

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

Sous-requêtes avec l'instruction INSERT

Les sous-requêtes peuvent également être utilisées avec des instructions INSERT. L'instruction INSERT utilise les données renvoyées par la sous-requête pour les insérer dans une autre table. Les données sélectionnées dans la sous-requête peuvent être modifiées avec l'une des fonctions de caractère, de date ou de nombre.

La syntaxe de base est la suivante -

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

Exemple

Considérez une table COMPANY_BKP, avec une structure similaire à la table COMPANY et peut être créée en utilisant le même CREATE TABLE en utilisant COMPANY_BKP comme nom de table. Maintenant, pour copier la table COMPANY complète dans COMPANY_BKP, voici la syntaxe -

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

Sous-requêtes avec l'instruction UPDATE

La sous-requête peut être utilisée conjointement avec l'instruction UPDATE. Une ou plusieurs colonnes d'une table peuvent être mises à jour lors de l'utilisation d'une sous-requête avec l'instruction UPDATE.

La syntaxe de base est la suivante -

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

Exemple

En supposant que nous ayons la table COMPANY_BKP disponible, qui est une sauvegarde de la table COMPANY.

L'exemple suivant met à jour SALARY de 0,50 fois dans la table COMPANY pour tous les clients, dont l'âge est supérieur ou égal à 27 -

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

Cela affecterait deux lignes et enfin la table COMPANY aurait les enregistrements suivants -

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)

Sous-requêtes avec l'instruction DELETE

La sous-requête peut être utilisée conjointement avec l'instruction DELETE comme avec toutes les autres instructions mentionnées ci-dessus.

La syntaxe de base est la suivante -

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

Exemple

En supposant que nous ayons la table COMPANY_BKP disponible, qui est une sauvegarde de la table COMPANY.

L'exemple suivant supprime les enregistrements de la table COMPANY pour tous les clients dont l'ÂGE est supérieur ou égal à 27 -

testdb=# DELETE FROM COMPANY
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
      WHERE AGE > 27 );

Cela affecterait deux lignes et enfin la table COMPANY aurait les enregistrements suivants -

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)