Korrelierte Unterabfragen, auch als verschachtelte Unterabfragen bekannt, sind Unterabfragen, die von der äußeren Abfrage abhängen. Sie werden wiederholt ausgeführt, einmal für jede Zeile, die von der äußeren Abfrage verarbeitet wurde. Das Schlüsselmerkmal ist, dass die innere Abfrage auf eine Spalte aus der SELECT
der äußeren Abfrage FROM
Klausel oder WHERE
Klausel verweist.
Lassen Sie uns mit einem Beispiel veranschaulichen. Angenommen, wir haben zwei Tabellen: Employees
und Departments
. department_id
Employees
department_name
department_id
employee_id
employee_name
Departments
Wir möchten den Namen jedes Mitarbeiters und den Namen seiner Abteilung finden.
Ein korrelierter Unterabbildungsansatz würde so aussehen:
<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>
In dieser Abfrage korreliert die innere Unterabfrage (SELECT d.department_name FROM Departments d WHERE d.department_id = e.department_id)
mit der äußeren Abfrage korreliert, da sie e.department_id
aus der Employees
der Outer Query verwendet. Für jede Zeile in der Employees
wird die innere Abfrage ausgeführt, um den entsprechenden Abteilungsnamen zu finden.
Korrelierte Unterabfragen können erheblich weniger effizient sein als andere Ansätze, insbesondere bei großen Datensätzen. Dies liegt daran, dass die innere Abfrage für jede Zeile in der äußeren Abfrage wiederholt ausgeführt wird. Dies führt zu einem verschachtelten Schleifenausführungsplan, der zu einer Leistung von O (N*m) führen kann, wobei n die Anzahl der Zeilen in der äußeren Abfrage und M die Anzahl der Zeilen in der inneren Abfrage ist. Dies kann für große Tische extrem langsam sein.
Der Datenbankoptimierer kann aufgrund der Abhängigkeit zwischen den inneren und den äußeren Abfragen möglicherweise keine korrelierte Unterabfrage so effektiv so effektiv optimieren. Die Datenbank -Engine kann in einigen Fällen möglicherweise nicht in der Lage sein, Indizes effizient zu verwenden, was die Leistung weiter beeinflusst. Die erhöhte Verarbeitungszeit und der Ressourcenverbrauch können zu einer langsamen Ausführung von Abfragen führen und sich möglicherweise auf die Gesamtdatenbankleistung auswirken.
Obwohl im Allgemeinen weniger effizient, können korrelierte Unterabfragen in bestimmten Situationen vorzuziehen sein:
JOIN
ohne Aggregation nicht direkt verarbeiten kann), kann eine korrelierte Unterabfrage erforderlich sein. Fast immer ist die effizienteste Alternative zu einer korrelierten Unterabfrage eine JOIN
. Ein JOIN
ermöglicht es der Datenbank, den Vorgang effizienter mithilfe optimierter Algorithmen auszuführen. Das gleiche Beispiel von oben kann mit einem JOIN
wie folgt umgeschrieben werden:
<code class="sql">SELECT e.employee_name, d.department_name FROM Employees e JOIN Departments d ON e.department_id = d.department_id;</code>
Diese JOIN
-Version ist erheblich schneller, da die Datenbank den Vorgang in einem einzigen Pass ausführen kann, wobei häufig Indexe zur Beschleunigung der Suche beschleunigt werden können. Andere Alternativen, abhängig von der spezifischen Abfrage, können die Verwendung von Fensterfunktionen oder gemeinsamen Tabellenausdrücken (CTEs) zur Verbesserung der Leistung und der Lesbarkeit umfassen. Diese Techniken ermöglichen häufig effizientere Abfragepläne im Vergleich zu korrelierten Unterabfragen.
Das obige ist der detaillierte Inhalt vonWie verwende ich korrelierte Unterabfragen in SQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!