T-SQL - Sous-requêtes

UNE sub-query ou Inner query ou Nested queryest une requête dans une autre requête SQL Server et incorporé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 tels que =, <,>,> =, <=, IN, BETWEEN, etc.

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

  • Vous devez mettre une sous-requête entre parenthèses.

  • Une sous-requête doit inclure une clause SELECT et une clause FROM.

  • Une sous-requête peut inclure des clauses WHERE, GROUP BY et HAVING facultatives.

  • Une sous-requête ne peut pas inclure de clauses COMPUTE ou FOR BROWSE.

  • Vous ne pouvez inclure une clause ORDER BY que lorsqu'une clause TOP est incluse.

  • Vous pouvez imbriquer des sous-requêtes jusqu'à 32 niveaux.

Sous-requêtes avec instruction SELECT

Syntaxe

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

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

Exemple

Considérez la table CUSTOMERS ayant les enregistrements suivants.

ID  NAME       AGE       ADDRESS            SALARY 
1   Ramesh     32        Ahmedabad          2000.00 
2   Khilan     25        Delhi              1500.00 
3   kaushik    23        Kota               2000.00 
4   Chaitali   25        Mumbai             6500.00 
5   Hardik     27        Bhopal             8500.00 
6   Komal      22        MP                 4500.00 
7   Muffy      24        Indore             10000.00

Appliquons la sous-requête suivante avec l'instruction SELECT.

SELECT *  
   FROM CUSTOMERS
   WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500)

La commande ci-dessus produira la sortie suivante.

ID  NAME       AGE       ADDRESS          SALARY 
4   Chaitali   25        Mumbai           6500.00 
5   Hardik     27        Bhopal           8500.00 
7   Muffy      24        Indore           10000.00

Sous-requêtes avec 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.

Syntaxe

Voici la syntaxe de base.

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

Exemple

Considérons une table CUSTOMERS_BKP avec une structure similaire à la table CUSTOMERS. Voici la syntaxe pour copier la table CUSTOMERS complète dans CUSTOMERS_BKP.

INSERT INTO CUSTOMERS_BKP 
   SELECT * FROM CUSTOMERS  
   WHERE ID IN (SELECT ID FROM CUSTOMERS)

Sous-requêtes avec 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.

Syntaxe

Voici la syntaxe de base.

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

Exemple

Supposons que nous ayons la table CUSTOMERS_BKP disponible qui est une sauvegarde de la table CUSTOMERS.

L'exemple de commande suivant met à jour SALARY de 0,25 fois dans la table CUSTOMERS pour tous les clients dont l'ÂGE est supérieur ou égal à 27.

UPDATE CUSTOMERS 
   SET SALARY = SALARY * 0.25 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 )

Cela aura un impact sur deux lignes et enfin la table CUSTOMERS aura les enregistrements suivants.

ID  NAME       AGE       ADDRESS             SALARY 
1   Ramesh     32        Ahmedabad           500.00 
2   Khilan     25        Delhi               1500.00 
3   kaushik    23        Kota                2000.00 
4   Chaitali   25        Mumbai              6500.00 
5   Hardik     27        Bhopal              2125.00 
6   Komal      22        MP                  4500.00 
7   Muffy      24        Indore              10000.00

Sous-requêtes avec 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.

Syntaxe

Voici la syntaxe de base.

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

Exemple

Supposons que nous ayons la table CUSTOMERS_BKP disponible qui est une sauvegarde de la table CUSTOMERS.

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

DELETE FROM CUSTOMERS 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >=27 )

Cela aurait un impact sur deux lignes et finalement la table CUSTOMERS aura les enregistrements suivants.

ID  NAME       AGE       ADDRESS          SALARY 
2   Khilan     25        Delhi            1500.00 
3   kaushik    23        Kota             2000.00 
4   Chaitali   25        Mumbai           6500.00  
6   Komal      22        MP               4500.00 
7   Muffy      24        Indore           10000.00