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

Requête sous-requête PostgreSQL

Une sous-requête, également appelée requête interne ou requête imbriquée, fait référence à l'insertion d'une instruction de requête dans la clause WHERE d'une requête PostgreSQL.

Les résultats d'une instruction SELECT peuvent être utilisés comme valeur d'entrée pour une autre instruction.

Une sous-requête peut être utilisée avec des instructions SELECT, INSERT, UPDATE et DELETE, et peut utiliser des opérateurs tels que =, <, >, >=, <=, IN, BETWEEN, etc.

Voici quelques règles que doit suivre une sous-requête :

  • Une sous-requête doit être encadrée par des parenthèses.

  • Une sous-requête ne peut avoir qu'une seule colonne dans la clause SELECT, sauf si plusieurs colonnes sont utilisées dans la requête principale pour comparer avec les colonnes sélectionnées de la sous-requête.

  • ORDER BY ne peut pas être utilisé dans une sous-requête, bien que ORDER BY puisse être utilisé dans la requête principale. GROUP BY peut être utilisé dans une sous-requête, et fonctionne de la même manière que ORDER BY.

  • Une sous-requête retourne plus d'une ligne, elle ne peut être utilisée qu'avec des opérateurs de valeur multiple, tels que l'opérateur IN.

  • L'opérateur BETWEEN ne peut pas être utilisé avec une sous-requête, mais BETWEEN peut être utilisé à l'intérieur d'une sous-requête.

La sous-requête utilisée dans l'instruction SELECT utilise

Les sous-requêtes sont généralement utilisées avec des instructions 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 en ligne

Créer la table COMPANY (Télécharger le fichier SQL COMPANY ),le contenu des données est le suivant :

w3codeboxdb# select * from COMPANY;
 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, utilisons une sous-requête dans l'instruction SELECT :

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

Le résultat obtenu est le suivant :

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

La sous-requête utilisée dans l'instruction INSERT utilise

La sous-requête peut également être utilisée avec l'instruction INSERT. L'instruction INSERT utilise les données renvoyées par la sous-requête pour insérer dans une autre table.

Les données sélectionnées dans la sous-requête peuvent être modifiées par n'importe quel caractère, fonction de date ou fonction numérique.

La syntaxe de base est la suivante :

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

Exemple en ligne

Si la structure de COMPANY_BKP est similaire à la table COMPANY et peut utiliser la même commande CREATE TABLE pour être créée, mais le nom de la table est modifié en COMPANY_BKP. Maintenant, copiez toute la table COMPANY dans COMPANY_BKP, la syntaxe est la suivante :

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

La sous-requête utilisée dans l'instruction UPDATE

Les sous-requêtes peuvent être combinées avec des instructions UPDATE. Lorsque des sous-requêtes sont utilisées dans des instructions UPDATE, une ou plusieurs colonnes de la table sont mises à jour.

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 ligne

Supposons que nous ayons une table COMPANY_BKP, qui est une sauvegarde de la table COMPANY.

L'exemple suivant met à jour le SALARY des clients AGE supérieurs à 27 le SALARY des clients est mis à jour pour devenir 0.50 fois :

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

Cela affectera deux lignes, et les enregistrements finaux dans la table COMPANY sont les 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)

La sous-requête utilisée dans l'instruction DELETE

Les sous-requêtes peuvent être combinées avec des instructions DELETE, comme mentionné dans les autres instructions 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 ligne

Supposons que nous ayons une table COMPANY_BKP, qui est une sauvegarde de la table COMPANY.

L'exemple suivant supprime tous les enregistrements AGE supérieurs ou égaux à 27 des enregistrements clients :

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

Cela affectera deux lignes, et les enregistrements finaux dans la table COMPANY sont les 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)