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