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

Requête sous-requête SQL

Dans ce tutoriel, vous apprendrez comment insérer une requête dans une autre requête en SQL.

Qu'est-ce qu'une requête imbriquée ?

La requête imbriquée, également appelée requête sous-jacente ou sous-sélection, estSELECTimplantée dans une autre requête SQL. WHERE ou HAVINGLes requêtes dans les clauses. Les données retournées par la sous-requête sont utilisées par l'instruction externe de la même manière que les valeurs littérales.

Les sous-requêtes fournissent une méthode simple et efficace pour traiter des requêtes dépendant des résultats d'une autre requête. Elles sont presque identiques aux instructions SELECT ordinaires, mais presque sans restriction. Les points les plus importants sont les suivants :

  • Une sous-requête doit toujours être placée entre des parenthèses.

  • Une sous-requête doit toujours retourner une seule colonne. Cela signifie que vous ne pouvez pas utiliser SELECT *), sauf si la table mentionnée ne contient qu'une seule colonne. Si l'objectif est une comparaison de lignes, vous pouvez utiliser une sous-requête retournant plusieurs colonnes.

  • Vous ne pouvez utiliser que des opérateurs de retour de multiples valeurs (par exempleIN ou NOT INopérateur) de lignes multiples d'une sous-requête.

  • Une sous-requête ne peut pas êtreUNION. Seule une instruction SELECT est autorisée.

Les sous-requêtes sont souvent utilisées avecSELECTcombinées avec une instructionINSERT,UPDATEouDELETEdans une instruction ou dans une autre sous-requête.

Sous-requête avec une instruction SELECT

Les requêtes suivantes ne retournent que les commandes d'une valeur supérieure à5000 dollars, ceux-ci contiennent les détails des clients. Il convient également de noter que nous avons utilisé le mot-cléDISTINCTLes valeurs cust_id redondantes ont été supprimées du jeu de résultats.

SELECT * FROM customers
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders WHERE order_value > 5000);

Astuce :Une sous-requête peut retourner une valeur unique, une ligne unique, une colonne unique ou une table contenant une ou plusieurs lignes ou une ou plusieurs colonnes.

Remarque :Une sous-requête peut être imbriquée dans une requête externeSELECT,INSERT,UPDATEouDELETEde l'instructionWHEREouHAVINGLes clauses peuvent également être imbriquées dans d'autres sous-requêtes.

Sous-requête avec une instruction INSERT

Une sous-requête peut également être utilisée avec une instruction INSERT. Voici un exemple :

INSERT INTO premium_customers 
SELECT * FROM customers 
WHERE cust_id IN (SELECT DISTINCT cust_id FROM orders WHERE order_value > 5000);

La requête ci-dessus insérera les enregistrements des clients de niveau supérieur dans la table premium_customers en utilisant les données retournées par la sous-requête. Les clients de niveau supérieur sont ceux qui ont passé des commandes d'une valeur supérieure à5000 dollars de clients.

Astuce : consultezÀ proposSQL Clone Tablepour apprendre comment utiliser l'instruction INSERT ... SELECT pour insérer rapidement plusieurs lignes d'une autre table dans une table.

Sous-requête avec une instruction UPDATE

Vous pouvez également combiner une sous-requête avec une instruction UPDATE pour mettre à jour une ou plusieurs colonnes d'une table, comme montré ci-dessous :

UPDATE orders
SET order_value = order_value + 10
WHERE cust_id IN (SELECT cust_id FROM customers WHERE postal_code = 75016);

en ajoutant la valeur actuelle de la commande10dollars, cette instruction mettra à jour les commandes (orders) avec le code postal75016valeur des commandes des clients de la région.

Sous-requête avec instruction DELETE

De même, vous pouvez combiner une sous-requête avec une instruction DELETE pour supprimer une ligne ou plusieurs lignes dans la table, comme suit :

DELETE FROM orders
DELETE FROM orders WHERE order_id IN (SELECT order_id FROM order_details WHERE product_id = 5);

La requête SQL de l'exemple précédent contiendraproduct_idpour5supprimer ces commandes de la table des commandes du produit.