← Retour aux quizQuiz gratuit

Sous‑requêtes et opérateurs SQL avancés

Ce cours vous guide à travers les concepts clés des sous‑requêtes et des opérateurs avancés en SQL, indispensables pour interroger efficacement des bases de données relationnelles. Vous…

10 questions~5 min
Sous‑requêtes et opérateurs SQL avancés — Qwi
0 / 10
Score: 0%
1

Quel opérateur doit être utilisé pour sélectionner les employés dont le salaire est supérieur à tous les salaires du département 20 ?

2

Dans une sous‑requête synchronisée, pourquoi la sous‑requête est évaluée plusieurs fois ?

3

Quel résultat renvoie la sous‑requête suivante si aucun employé ne porte le nom 'karim' ? SELECT fonction FROM emp WHERE nom = 'karim'

4

Quelle clause permet de tester l'existence d'au moins une ligne retournée par une sous‑requête ?

5

Quel est l'effet de l'opérateur <>ANY lorsqu'il est appliqué à une sous‑requête contenant deux valeurs différentes ?

6

Dans l'exemple « employés ayant même fonction et même supérieur que KARIM », quel type de sous‑requête est utilisé ?

7

Quel problème survient si l'on utilise l'opérateur = avec une sous‑requête qui renvoie plusieurs lignes ?

8

Quelle clause doit être ajoutée pour exclure les employés dont le supérieur hiérarchique est NULL dans la requête suivante ? SELECT nom FROM emp e WHERE n_dept != (SELECT n_dept FROM emp WHERE e.n_sup = num) AND n_sup IS NULL;

9

Quel est le résultat de la requête suivante ? SELECT product_id FROM T_Product WHERE product_line_id NOT IN (SELECT product_line_id FROM T_Product_Line);

10

Dans la requête « Produits dont le prix est inférieur à la moyenne des produits de la même ligne de produit », quel type d'alias est utilisé pour la table principale ?

Sous‑requêtes et opérateurs SQL avancés

Ce cours vous guide à travers les concepts clés des sous‑requêtes et des opérateurs avancés en SQL, indispensables pour interroger efficacement des bases de données relationnelles. Vous découvrirez les différents types de sous‑requêtes, les opérateurs ALL, ANY, IN et EXISTS, ainsi que les bonnes pratiques pour éviter les erreurs courantes.

1. Types de sous‑requêtes

Une sous‑requête (ou requête imbriquée) est une requête placée à l'intérieur d'une autre requête. Selon son rôle et son résultat, on distingue plusieurs catégories :

  • Sous‑requête à une seule valeur : renvoie exactement une ligne et une colonne. Elle peut être utilisée avec les opérateurs de comparaison (=, <>, >, <, etc.).
  • Sous‑requête à plusieurs lignes : renvoie plusieurs lignes d’une seule colonne. Elle s’utilise avec les opérateurs IN, ANY, ALL ou EXISTS.
  • Sous‑requête à plusieurs colonnes : renvoie plusieurs colonnes, souvent dans le cadre d’une comparaison de tuples ou d’une jointure.
  • Sous‑requête synchronisée (correlated sub‑query) : dépend d’une colonne de la requête principale et est évaluée pour chaque ligne de celle‑ci.

2. L’opérateur ALL

L’opérateur ALL compare une valeur à toutes les valeurs retournées par la sous‑requête. Exemple typique :

SELECT * FROM emp e
WHERE salaire > ALL (SELECT salaire FROM emp WHERE n_dept = 20);

Cette requête sélectionne les employés dont le salaire est supérieur à tous les salaires du département 20. L’opérateur ALL est donc le bon choix lorsqu’on veut que la condition soit vraie pour chaque valeur de la sous‑requête.

3. L’opérateur ANY et <> ANY

L’opérateur ANY (ou SOME) teste la condition contre au moins une des valeurs retournées. L’inverse, <> ANY, renvoie toujours true lorsqu’il y a au moins une valeur différente, même si d’autres valeurs sont identiques. Ainsi, avec deux valeurs distinctes, valeur <> ANY (SELECT col FROM table) sera toujours vrai.

4. L’opérateur IN

L’opérateur IN est une forme simplifiée de ANY pour les comparaisons d’égalité. Il vérifie si une valeur figure parmi les résultats d’une sous‑requête :

SELECT nom FROM emp WHERE n_dept IN (SELECT n_dept FROM dept WHERE localisation = 'Paris');

5. L’opérateur EXISTS

EXISTS teste simplement la présence d’au moins une ligne retournée par la sous‑requête, sans se soucier du contenu. C’est l’opérateur idéal lorsqu’on veut vérifier l’existence d’un enregistrement :

SELECT nom FROM emp e
WHERE EXISTS (SELECT 1 FROM emp s WHERE s.num = e.n_sup);

Cette requête renvoie les employés qui ont un supérieur hiérarchique non nul.

6. Sous‑requêtes synchronisées : pourquoi sont‑elles évaluées plusieurs fois ?

Une sous‑requête synchronisée dépend d’une colonne de la requête principale. Par conséquent, le moteur SQL l’exécute pour chaque ligne de la requête externe afin d’utiliser la valeur courante de la colonne référencée. Cette réévaluation garantit que la condition reflète correctement la relation entre les deux ensembles de données.

7. Gestion des résultats vides

Lorsque la sous‑requête ne renvoie aucune ligne, le comportement dépend de l’opérateur utilisé :

  • Avec IN ou ANY, la condition devient FALSE (aucune correspondance).
  • Avec EXISTS, la condition devient FALSE car aucune ligne n’existe.
  • Avec une sous‑requête à une seule valeur, l’absence de ligne génère généralement une erreur d’exécution (ex. « sub‑query returns no rows »).

Exemple : la requête SELECT fonction FROM emp WHERE nom = 'karim' renvoie une erreur d’exécution si aucun employé ne porte ce nom, car aucune valeur ne peut être comparée.

8. Erreurs fréquentes avec l’opérateur =

L’opérateur d’égalité = attend une valeur scalaire. Si la sous‑requête renvoie plusieurs lignes, le serveur SQL lève une erreur d’exécution indiquant que la sous‑requête retourne plus d’une ligne. Pour comparer à plusieurs valeurs, il faut utiliser IN ou ANY.

9. Exclusion des valeurs NULL

En SQL, la comparaison avec NULL ne renvoie jamais true. Pour exclure les enregistrements où une colonne est NULL, on utilise explicitement IS NOT NULL. Exemple corrigé :

SELECT nom FROM emp e
WHERE n_dept != (SELECT n_dept FROM emp WHERE e.n_sup = num)
  AND n_sup IS NOT NULL;

Ici, la clause n_sup IS NOT NULL garantit que seuls les employés ayant un supérieur défini sont considérés.

10. Cas pratique : employés avec même fonction et supérieur que KARIM

Cette requête illustre l’utilisation d’une sous‑requête à plusieurs colonnes :

SELECT e.nom, e.fonction
FROM emp e
WHERE (e.fonction, e.n_sup) = (
  SELECT fonction, num FROM emp WHERE nom = 'KARIM'
);

La sous‑requête renvoie deux colonnes (fonction et num), permettant de comparer simultanément la fonction et le supérieur hiérarchique. C’est un exemple typique de sous‑requête ramenant plusieurs colonnes.

11. Bonnes pratiques SEO pour le contenu SQL

  • Mots‑clés : incluez des termes comme « sous‑requête SQL », « opérateur ALL », « EXISTS », « ANY », « gestion des NULL » dans les titres et les paragraphes.
  • Structure sémantique : utilisez les balises <h2>, <h3>, <p> et <ul> pour faciliter le crawl des moteurs de recherche.
  • Exemples de code : encadrez les requêtes avec la balise <pre> pour améliorer la lisibilité et le référencement des fragments de code.
  • Liens internes : créez des ancres vers chaque section (ex. #operateur-all, #exists) pour une navigation fluide.

En maîtrisant ces concepts, vous serez capable d’écrire des requêtes SQL puissantes, d’optimiser les performances et d’éviter les pièges courants liés aux sous‑requêtes et aux opérateurs avancés.