Les sous-requêtes corrélées, également appelées sous-requêtes imbriquées, sont des sous-requêtes qui dépendent de la requête extérieure. Ils sont exécutés à plusieurs reprises, une fois pour chaque ligne traitée par la requête extérieure. La caractéristique clé est que la requête intérieure fait référence à une colonne de la liste SELECT
de la requête extérieure, FROM
la clause ou WHERE
clause.
Illustrons avec un exemple. Supposons que nous ayons deux tables: Employees
et Departments
. Employees
ont des colonnes employee_id
, employee_name
et department_id
, tandis que Departments
ont department_id
et department_name
. Nous voulons trouver le nom de chaque employé et le nom de leur département.
Une approche de sous-requête corrélée ressemblerait à ceci:
<code class="sql">SELECT e.employee_name, (SELECT d.department_name FROM Departments d WHERE d.department_id = e.department_id) AS department_name FROM Employees e;</code>
Dans cette requête, la sous-requête intérieure (SELECT d.department_name FROM Departments d WHERE d.department_id = e.department_id)
est corrélée à la requête extérieure car elle utilise e.department_id
à partir de la table Employees
de la requête extérieure. Pour chaque ligne de la table Employees
, la requête intérieure est exécutée pour trouver le nom du département correspondant.
Les sous-requêtes corrélées peuvent être nettement moins efficaces que les autres approches, en particulier avec les grands ensembles de données. En effet, la requête intérieure est exécutée à plusieurs reprises pour chaque ligne de la requête extérieure. Cela conduit à un plan d'exécution en boucle imbriquée, qui peut entraîner une performance o (n * m), où n est le nombre de lignes dans la requête extérieure et m est le nombre de lignes dans la requête intérieure. Cela peut être extrêmement lent pour les grandes tables.
L'optimiseur de la base de données pourrait ne pas être en mesure d'optimiser une sous-requête corrélée aussi efficacement qu'une jointure en raison de la dépendance entre les requêtes intérieures et externes. Le moteur de la base de données peut ne pas être en mesure d'utiliser efficacement les index dans certains cas, ce qui a un impact supplémentaire sur les performances. L'augmentation du temps de traitement et de la consommation de ressources peut entraîner une lente exécution des requêtes et potentiellement un impact sur les performances globales de la base de données.
Bien que généralement moins efficace, les sous-requêtes corrélées peuvent être préférables dans des situations spécifiques:
JOIN
ne peut pas gérer directement sans agrégation), une sous-requête corrélée peut être nécessaire. Presque toujours, l'alternative la plus efficace à une sous-requête corrélée est une JOIN
. Une JOIN
permet à la base de données d'effectuer l'opération plus efficacement en utilisant des algorithmes optimisés. Le même exemple d'en haut peut être réécrit à l'aide d'une JOIN
comme suit:
<code class="sql">SELECT e.employee_name, d.department_name FROM Employees e JOIN Departments d ON e.department_id = d.department_id;</code>
Cette version JOIN
est considérablement plus rapide car la base de données peut effectuer l'opération en une seule réussite, utilisant souvent des index pour accélérer la recherche. D'autres alternatives, selon la requête spécifique, peuvent inclure l'utilisation de fonctions de fenêtre ou d'expressions de table courantes (CTES) pour améliorer les performances et la lisibilité. Ces techniques permettent souvent des plans de requête plus efficaces par rapport aux sous-requêtes corrélées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!