English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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])
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 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 ]
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);
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) ]
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)
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) ]
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)