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
- Sous-requête non corrélée
- 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.