Articles

Sous-requête Corrélée SQL

Résumé : dans ce tutoriel, vous découvrirez la sous-requête corrélée SQL qui est une sous-requête qui utilise des valeurs de la requête externe.

Introduction à la sous-requête corrélée SQL

Commençons par un exemple.

Voir la table employees suivante dans l’exemple de base de données :

Sous-requête corrélée SQL: Tableau des employés

La requête suivante trouve les employés dont le salaire est supérieur au salaire moyen de tous les employés :

SELECT employee_id, first_name, last_name, salaryFROM employeesWHERE salary > (SELECT AVG(salary) FROM employees);
Exemple de sous-requête SQL

Dans cet exemple, la sous-requête est utilisée dans la clause WHERE. Vous pouvez voir certains points de cette requête:

Tout d’abord, vous pouvez exécuter la sous-requête qui renvoie le salaire moyen de tous les employés de manière indépendante.

SELECT AVG(salary)FROM employees;

Deuxièmement, le système de base de données ne doit évaluer la sous-requête qu’une seule fois.

Troisièmement, la requête externe utilise le résultat renvoyé par la sous-requête. La requête externe dépend de la sous-requête pour sa valeur. Cependant, la sous-requête ne dépend pas de la requête externe. Parfois, nous appelons cette sous-requête est une sous-requête simple.

Contrairement à une sous-requête simple, une sous-requête corrélée est une sous-requête qui utilise les valeurs de la requête externe. En outre, une sous-requête corrélée peut être évaluée une fois pour chaque ligne sélectionnée par la requête externe. Pour cette raison, une requête qui utilise une sous-requête corrélée peut être lente.

Une sous-requête corrélée est également appelée sous-requête répétitive ou sous-requête synchronisée.

Exemples de sous-requêtes corrélées SQL

Voyons quelques exemples supplémentaires des sous-requêtes corrélées pour mieux les comprendre.

Sous-requête corrélée SQL dans l’exemple de clause WHERE

La requête suivante trouve tous les employés dont le salaire est supérieur au salaire moyen des employés de leurs départements :

SELECT employee_id, first_name, last_name, salary, department_idFROM employees eWHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id)ORDER BY department_id , first_name , last_name;

Voici la sortie:

Exemple de sous-requête corrélée SQL

Dans cet exemple, la requête externe est :

SELECT employee_id, first_name, last_name, salary, department_idFROM employees eWHERE salary >...

et la requête corrélée la sous-requête est :

SELECT AVG( list_price )FROM productsWHERE category_id = p.category_id

Pour chaque employé, le système de base de données doit exécuter la sous-requête corrélée une fois pour calculer le salaire moyen des employés dans le département de l’employé actuel.

Sous-requête corrélée SQL dans l’exemple de clause SELECT

La requête suivante renvoie les employés et le salaire moyen de tous les employés de leurs départements :

SELECT employee_id, first_name, last_name, department_name, salary, (SELECT ROUND(AVG(salary),0) FROM employees WHERE department_id = e.department_id) avg_salary_in_departmentFROM employees e INNER JOIN departments d ON d.department_id = e.department_idORDER BY department_name, first_name, last_name;

La sortie est :

SQL corrélée Sous-requête dans la clause SELECT

Pour chaque employé, le système de base de données doit exécuter la sous-requête corrélée une fois pour calculer le salaire moyen par le département de l’employé.

Sous-requête corrélée SQL avec l’exemple de l’opérateur EXISTS

Nous utilisons souvent une sous-requête corrélée avec l’opérateur EXISTS. Par exemple, la requête suivante renvoie tous les employés qui n’ont pas de personnes à charge :

SELECT employee_id, first_name, last_nameFROM employees eWHERE NOT EXISTS( SELECT * FROM dependents d WHERE d.employee_id = e.employee_id)ORDER BY first_name , last_name;

L’image suivante montre la sortie :

Sous-requête corrélée SQL avec l'opérateur EXISTS

Dans ce tutoriel, vous avez appris la sous-requête corrélée SQL et comment l’appliquer pour former une requête complexe.

  • Ce tutoriel a-t-il été utile?
  • Ouinon