Les sous-requêtes

Une sous-requête est une instruction select qui peut être utilisée à l’endroit d’une valeur inconnue (laquelle est alors connue lorsque la sous-requête est effectuée). De fait, les sous-requêtes constituent une façon indirecte de mettre en relation plusieurs tables, puisque la sous-requête peut être construite sur une table autre que celle de la requête principale.

On peut utiliser une sous-requête là où une condition peut s’utiliser (i.e. les clauses WHERE et HAVING).

Les sous-requêtes peuvent aussi s’imbriquer, i.e. une sous-requête peut faire appel à une sous-requête qui, elle-même, fait appel à une sous-requête, etc.

1.1 L’opérateur IN

Comme la sous-requête peut retourner plusieurs lignes, son résultat équivaut à un ensemble de valeurs. L’opérateur adapté à cette situation est IN.

Quels sont les produits qui appartiennent à des classes taxables?

SELECT code_produit
FROM produit
WHERE classe IN (SELECT classe
FROM classe
WHERE taxable <> 0 );

Conditions d’utilisation:

  • Les colonnes comparées doivent être de types de données compatibles.
  • Si on compare plusieurs colonnes, il faut les placer entre parenthèses.
  • Il est possible d’utiliser l’opérateur ‘ = ‘, mais il faut absolument que la sousrequête ne produise qu’une seule ligne (une seule valeur).

1.2 Les sous-requêtes entrelacées

On réalise une sous-requête entrelacée lorsqu’une condition de la sous-requête fait référence à une ligne de la table du select principal. Ceci signifie, contrairement à une sousrequête simple, que la sous-requête entrelacée est évaluée à nouveau pour chacune des lignes de la requête principale.

Pour être capable de faire référence à une ligne de la table de la requête principale, on peut être obligé d’utiliser le nom explicite des colonnes avec lesquelles est construit la condition.

Nom explicite

Le nom explicite d’une colonne correspond au nom de la table combiné
avec le nom de la colonne (table.colonne). Un point sépare les deux
noms.

Si la même table est utilisée dans la sous-requête et la requête principale, alors il peut être nécessaire d’utiliser un alias pour les tables.

Alias d’une table

Remplace, pour l’usage d’une requête, le nom d’une table. L’alias d’une
table se définit de la même façon que l’alias d’une colonne, i.e. l’alias
est séparé de la colonne par un espace ou par le mot clé AS.

Quelles sont les sorties d’inventaire dont la quantité de pièces sorties est
supérieure à la quantité moyenne de toutes les sorties effectuées sur le compte du même projet?


SELECT no_sortie
FROM sortie S1
WHERE quantite > (SELECT AVG(quantite)
FROM sortie S2
WHERE S2.code_projet = S1.code_projet);

1.3 L’opérateur EXISTS

Avec les sous-requêtes, on peut aussi utiliser un opérateur n’est pas de fournir des valeurs, mais de simplement s’assurer que des conditions sont respectées. Cet opérateur EXISTS a pour tâche de vérifier qu’il existe au moins une ligne qui répond aux conditions demandées.

SELECT liste des colonnes
FROM table
WHERE EXISTS (sous-requête);

Dans ce cas, la requête principale est exécutée si la sous-requête retourne au moins une ligne.

Remarquez qu’aucune colonne n’est indiquée dans la clause WHERE puisqu’aucune comparaison de valeurs n’est faite. Tout ce qui est demandé c’est que la sous-requête trouve au moins une ligne qui respecte les conditions précisées dans la sous-requête.

L’opérateur EXISTS est souvent plus utile avec une sous-requête entrelacée où la condition d’existence est revérifiée à chaque ligne de la requête principale.

Quelles sont les classes de produit auxquelles aucun produit en inventaire
n’appartient?


SELECT classe
FROM classe
WHERE NOT EXISTS (SELECT *
FROM produit
WHERE produit.classe = classe.classe);

Print Friendly, PDF & Email

Laisser un commentaire