Sous-requêtes SQL

Les sous-requêtes SQL sont utilisées pour combiner différentes requêtes en une seule instruction.

Les sous-requêtes sont toujours traitées en commençant par l’instruction SELECT la plus interne et en allant vers l’extérieur.

Exemple:

SELECT ordre_conso_id
    FROM tb_ordre
    WHERE ordre_num IN
      (SELECT ordre_objet_num
         FROM tb_ordre_objet
      WHERE ordre_objet_prod_id = 'RGAN01');

Lorsque l’instruction SELECT précédente est traitée, le SGBD effectue en fait deux opérations.

Il exécute d’abord la sous-requête :

SELECT ordre_objet_num
    FROM tb_ordre_objet
   WHERE ordre_objet_prod_id = 'RGAN01'

Cette requête s’appelle “Inner Query”.

Cette requête renvoie deux numéros d’ordre 20007 et 20008. Ces deux valeurs sont ensuite transmises à la clause WHERE de la “requête externe” dans le format délimité par des virgules requis par l’opérateur IN. La requête externe devient alors la suivante :

SELECT ordre_conso_id
    FROM tb_ordre
    WHERE ordre_num IN (20007,20008)

Vous pouvez utiliser une sous-requête dans une comparaison simple :

  • IN
  • ANY
  • SOME
  • ALL
  • EXIST
  • Si une sous-requête renvoie une seule ligne, l’opérateur =, <, >, <=, >= ou <> peut être utilisé pour la comparaison avec la sous-requête. Si plusieurs enregistrements sont renvoyés, l’opérateur IN, ANY, ALL ou SOME doit être utilisé. Avec ANY ou SOME, la condition doit être vraie pour l’une des valeurs renvoyées par la sous-requête. Avec ALL, la condition doit être vraie pour toutes les valeurs renvoyées par la sous-requête.

Exemple:

La sous-requête qui utilise l’opérateur ANY est la suivante :

SELECT conso_no
  FROM tb_cons
  WHERE conso_no = ANY
    (SELECT inv_cons_no
       FROM tb_inv
       WHERE inv_total > 200);

Types de sous-requêtes

  1. Sous-requête non corrélée
  2. Sous-requête corrélée

Sous-requête non corrélée :

Dans la sous-requête, si la requête interne et la requête externe fonctionnent indépendamment, la sous-requête est appelée sous-requête non corrélée.