Code SQL copié dans le presse-papiers
Introduction aux sous-requêtes SQL : apprenez à imbriquer des requêtes pour filtrer dynamiquement, créer des vues temporaires et manipuler des ensembles de données complexes. Cette leçon couvre les sous-requêtes scalaires, multi-lignes et vues en ligne, avec des exemples pratiques pour la base Sakila.
RU EN PT

Leçon 6.1 : Introduction aux sous-requêtes — Requêtes imbriquées et vues en ligne

Dans les modules précédents, nous avons appris à récupérer des données et à les joindre. Mais parfois, une seule requête ne suffit pas pour obtenir la réponse. Il faut d'abord trouver une valeur (comme une moyenne ou un ID spécifique), puis l'utiliser dans une autre requête. C'est là qu'interviennent les sous-requêtes.

Qu'est-ce qu'une sous-requête ?

Une sous-requête (ou requête interne) est une instruction SELECT imbriquée dans une autre instruction SQL. La requête qui contient la sous-requête est appelée requête externe (ou principale).

Les sous-requêtes sont toujours entourées de parenthèses ().

Logique centrale : fonctionnement

En général, la base exécute d'abord la requête interne. Le résultat est ensuite transmis à la requête externe, qui l'utilise pour compléter son exécution.

-- Exemple conceptuel
SELECT column_name
FROM table_name
WHERE column_name = (SELECT value FROM another_table);
                    ^------- Ceci s'exécute en premier -------^

Catégories de sous-requêtes

Les sous-requêtes sont classées selon le type de données retournées :

  1. Sous-requête scalaire : Retourne une seule valeur (une ligne, une colonne).
  2. Sous-requête multi-lignes : Retourne une liste de valeurs (une colonne, plusieurs lignes).
  3. Sous-requête table (vue en ligne) : Retourne un ensemble de résultats (plusieurs colonnes et lignes), utilisée dans la clause FROM comme une table temporaire.

1. Sous-requêtes imbriquées (dans WHERE)

L'usage le plus courant est dans la clause WHERE pour filtrer selon une valeur dynamique.

Scénario : Trouver les films dont le coût de remplacement est supérieur à la moyenne de tous les films.

SELECT
    title,
    replacement_cost
FROM
    film
WHERE
    replacement_cost > (SELECT AVG(replacement_cost) FROM film);
  • Requête interne : Calcule la moyenne (ex. 19,98 $).
  • Requête externe : Trouve tous les films dont le coût est supérieur à cette moyenne.

2. Vues en ligne (dans FROM)

Quand une sous-requête est placée dans la clause FROM, on parle de vue en ligne. On crée ainsi une table temporaire "à la volée" qui n'existe que pour la durée de la requête.

Note : Il faut obligatoirement donner un alias à la vue en ligne.

Scénario : Obtenir la liste des clients actifs et la joindre à leurs paiements.

-- Exemple de vue en ligne
SELECT c.first_name, c.last_name, p.amount
FROM (
    SELECT customer_id, first_name, last_name
    FROM customer
    WHERE active = 1
) AS c
INNER JOIN payment AS p ON c.customer_id = p.customer_id;

Points clés de cette leçon :

  • Les sous-requêtes permettent d'imbriquer des requêtes pour des analyses avancées.
  • Utilisez-les dans WHERE pour filtrer dynamiquement, ou dans FROM pour créer des vues temporaires.
  • Les sous-requêtes scalaires, multi-lignes et vues en ligne offrent une grande flexibilité pour manipuler les données.
  • Les alias sont obligatoires pour les vues en ligne.

Dans la prochaine leçon, nous approfondirons les sous-requêtes multi-lignes et verrons comment les utiliser avec IN, ANY, ALL et d'autres opérateurs.