Einführung
Stellen Sie sich vor, Sie versuchen, eine bestimmte Info aus einer riesigen Bibliothek zu finden, in der einige Bücher andere kleinere Bücher enthalten. Um die richtige Antwort zu finden, müssen Sie sich möglicherweise zuerst die kleineren Bücher ansehen und diese Informationen dann verwenden, um das größere zu finden. Genau so funktionieren verschachtelte Abfragen in SQL Arbeit! Indem Sie eine Abfrage in eine andere einfügen, können Sie komplexe Daten mit Leichtigkeit extrahieren. In diesem Leitfaden untersuchen wir, wie verschachtelte Abfragen funktionieren und wie Sie ihre Leistungsfähigkeit in SQL für effizientere Datenbankverwaltung.
Lernergebnis
- Verstehen Sie, was verschachtelte Abfragen (Unterabfragen) in SQL sind.
- Schreiben und implementieren Sie verschachtelte Abfragen innerhalb verschiedener SQL-Anweisungen.
- Unterscheiden Sie zwischen korrelierten und nicht korrelierten verschachtelten Abfragen.
- Optimieren Sie SQL-Abfragen mithilfe verschachtelter Strukturen für eine bessere Leistung.
Was sind verschachtelte Abfragen in SQL?
Eine verschachtelte Abfrage, auch Unterabfrage genannt, ist eine SQL-Abfrage, die in eine andere SQL-Abfrage eingefügt wird. Das Ergebnis der inneren Abfrage (der Unterabfrage) wird von der äußeren Abfrage verwendet, um das gewünschte Ergebnis zu erzielen. Dieser Ansatz ist besonders nützlich, wenn die Ergebnisse der inneren Abfrage von den von der äußeren Abfrage abgerufenen Daten abhängen.
Grundlegende Syntax
SELECT column_name(s)
FROM table_name
WHERE column_name = (SELECT column_name FROM table_name WHERE situation);
Arten verschachtelter Abfragen in SQL
Verschachtelte Abfragen, auch Unterabfragen genannt, ermöglichen Ihnen die Durchführung komplexer Datenabfragen, indem Sie eine SQL-Abfrage in eine andere einbetten. Diese Funktion ist für das Schreiben effizienten SQL-Codes und die Handhabung komplexer Datenbankoperationen unerlässlich. In diesem Abschnitt werden die verschiedenen Arten verschachtelter Abfragen mit Beispielen und erwarteten Ergebnissen erläutert.
Einzeilige Unterabfrage in SQL
Eine Einzelzeilen-Unterabfrage ist ein verschachtelter Abfragetyp, der eine oder mehrere Spalten in nur einer Zeile ergibt. Dies kommt sehr häufig bei SQL-Anweisungen vor, bei denen Sie einen Vergleichsoperator oder eine Bedingung für einen einzelnen Wert verwenden möchten, z. B. =, <, > usw.
Wichtige Merkmale einzeiliger Unterabfragen
- Gibt eine Zeile zurück: Aufgrund des vergebenen Namens kann man eine einzelne Datenzeile erwarten.
- Normalerweise mit Vergleichsoperatoren verwendet: Wird normalerweise mit Operatoren wie =, >, <, >=, <= usw. verwendet.
- Kann eine oder mehrere Spalten zurückgeben: Obwohl es eine einzelne Zeile zurückgibt, können dennoch mehrere Spalten zurückgegeben werden.
Beispiel: Mitarbeiter finden, die mehr als das Durchschnittsgehalt verdienen
Tisch: workers
Mitarbeiter-ID | Vorname | Nachname | Gehalt | Abteilungs-ID |
---|---|---|---|---|
1 | John | Damhirschkuh | 90000 | 1 |
2 | Julia | Schmied | 95000 | 1 |
3 | Alice | Johnson | 60000 | 2 |
4 | Bob | Braun | 65000 | 2 |
5 | Charlie | Davis | 40000 | 3 |
6 | Vorabend | Adams | 75000 | 3 |
Tisch: departments
Abteilungs-ID | Abteilungsname | Standort-ID |
---|---|---|
1 | Verkäufe | 1700 |
2 | Advertising | 1700 |
3 | ES | 1800 |
4 | Personalwesen | 1900 |
SELECT first_name, last_name, wage
FROM workers
WHERE wage > (SELECT AVG(wage) FROM workers);
Ausgabe:
| first_name | last_name | wage |
|------------|-----------|--------|
| John | Doe | 90000 |
| Jane | Smith | 95000 |
Im Beispiel ermittelt die innere Abfrage (SELECT AVG(wage) FROM workers) die Durchschnittsgehälter aller Mitarbeiter. Die äußere Abfrage ermittelt Vor- und Nachnamen sowie das Gehalt aller Mitarbeiter, deren Verdienst über dieser Zahl liegt.
Mehrzeilige Unterabfrage in SQL
Eine mehrzeilige Unterabfrage ist eine Artwork verschachtelte Abfrage, die daher mehr als eine Datenzeile zurückgibt. Sie wird normalerweise mit den Operatoren IN, ANY oder ALL verwendet, um eine Spalte mit einer Reihe von Werten zu vergleichen, die von der Unterabfrage zurückgegeben werden. Einer der Vorteile der Verwendung einer mehrzeiligen Unterabfrage besteht darin, dass sie die Ergebnisse einer Werteliste kombiniert und bei der Berechnung mehrere Zeilen anwendet.
Beispiel: Mitarbeiter in bestimmten Abteilungen finden
SELECT first_name, last_name
FROM workers
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);
Ausgabe:
| first_name | last_name |
|------------|-----------|
| Alice | Johnson |
| Bob | Brown |
Hier ruft die innere Abfrage ab department_id
s aus dem departments
Tabelle, in der die location_id
beträgt 1700. Die äußere Abfrage findet dann Mitarbeiter, die in diesen Abteilungen arbeiten.
Korrelierte Unterabfrage in SQL
Eine korrelierte Unterabfrage ist eine Artwork verschachtelter Abfrage in SQL. Ihre Werte hängen von der äußeren Abfrage ab. Während eine normale Unterabfrage unabhängig ausgeführt werden kann, berechnet eine korrelierte Unterabfrage in Bezug auf jede Zeile, die von der äußeren Abfrage verarbeitet wird, und ist daher dynamisch und kontextsensitiv.
Merkmale korrelierter Unterabfragen
- Abhängigkeit: Die innere Abfrage verweist auf Spalten der äußeren Abfrage und stellt so eine direkte Abhängigkeit her.
- Zeilenweise Ausführung: Die innere Abfrage wird mehrmals ausgeführt – einmal für jede Zeile, die von der äußeren Abfrage verarbeitet wird.
- Überlegungen zur Leistung: Da die innere Abfrage wiederholt ausgeführt wird, können korrelierte Unterabfragen langsamer sein als ihre nicht korrelierten Gegenstücke, insbesondere bei großen Datensätzen.
Beispiel: Mitarbeiter mit Gehältern über dem Durchschnitt ihrer Abteilung finden
SELECT first_name, wage
FROM workers e1
WHERE wage > (SELECT AVG(wage) FROM workers e2 WHERE e1.department_id = e2.department_id);
Ausgabe:
| first_name | wage |
|------------|--------|
| John | 90000 |
| Jane | 95000 |
In diesem Fall berechnet die innere Abfrage das Durchschnittsgehalt für jede Abteilung, während die äußere Abfrage jeden Mitarbeiter verarbeitet. Die äußere Abfrage wählt Mitarbeiter aus, die mehr als das Durchschnittsgehalt ihrer Abteilung verdienen.
Verschachtelte Unterabfragen in SQL
Eine verschachtelte Unterabfrage wird auch als verschachtelte Abfrage bezeichnet. Dabei handelt es sich um eine innere Abfrage oder eine Abfrage, die innerhalb einer anderen Abfrage platziert ist, wobei eine Abfrage innerhalb einer anderen erscheint. Solche Abfragen sind sehr praktisch, um auf schwierige Daten zuzugreifen und sie auf recht spezifische Weise zu transformieren. Dadurch können komplexe Probleme in mehrere Bestandteile zerlegt und überschaubarere Teile verarbeitet werden, was die Abfrage relationaler Datenbanken erheblich vereinfacht.
Struktur verschachtelter Unterabfragen
Eine verschachtelte Unterabfrage besteht normalerweise aus zwei Hauptkomponenten:
- Äußere Abfrage: Dies ist die Hauptabfrage, die die Unterabfrage enthält. Sie verwendet das Ergebnis der Unterabfrage, um Daten zu filtern oder zu bearbeiten.
- Innere Abfrage (Unterabfrage): Diese Abfrage ist in die äußere Abfrage eingebettet und stellt einen Ergebnissatz bereit, der von der äußeren Abfrage verwendet werden kann.
Beispiel: Abteilungen mit Mitarbeitern finden, die mehr als das Durchschnittsgehalt verdienen
SELECT department_id, department_name
FROM departments
WHERE department_id IN (
SELECT department_id
FROM workers
WHERE wage > (SELECT AVG(wage) FROM workers)
);
Ausgabe:
| department_id | department_name |
|---------------|------------------|
| 1 | Gross sales |
| 2 | Advertising |
In diesem Beispiel ermittelt die innerste Abfrage (SELECT AVG(wage) FROM workers) den Durchschnitt. Die mittlere Abfrage holt die Abteilungs-IDs der Mitarbeiter ab, die über diesem Durchschnitt verdienen, und die äußere Abfrage ruft die ihr zugewiesenen Abteilungsnamen ab.
Skalare Unterabfrage
Eine skalare Unterabfrage ist als eine Unterabfrage definiert, die einen einzelnen Wert, eine einzelne Zeile und eine einzelne Spalte ausgibt. Skalare Unterabfragen sind daher überall dort sehr praktisch, wo in der Hauptabfrage ein einzelner Wert erforderlich ist. Skalare Unterabfragen können in vielen SQL-Klauseln wie SELECT, WHERE und HAVING verwendet werden.
Eigenschaften skalarer Unterabfragen
- Gibt einen Wert zurück: Wie der Identify schon sagt, gibt eine skalare Unterabfrage nur einen einzigen Wert zurück. Jede Unterabfrage, die versucht, eine andere als eine Zeile oder eine andere als eine Spalte zurückzugeben, führt zu einem Fehler.
- Wird in verschiedenen Klauseln verwendet: Abgeleitete Spalten können in den SELECT-Anweisungen berechnet werden, indem die Ergebnisse in WHERE-Klauseln eingegrenzt werden und indem Bedingungen für eine Datensammlung innerhalb einer HAVING-Klausel hinzugefügt werden – alles mit Hilfe dieser skalaren Unterabfragen innerhalb dieser Klausel.
- Effizient für Vergleiche: Sie werden häufig verwendet, um Vergleiche mit einem einzelnen Wert anzustellen, der aus einer anderen Abfrage abgeleitet wurde.
Beispiel: Mitarbeiter und Gehaltsdifferenz zum Durchschnittsgehalt abrufen
SELECT first_name, last_name, wage - (SELECT AVG(wage) FROM workers) AS salary_difference
FROM workers;
Ausgabe:
| first_name | last_name | salary_difference |
|------------|-----------|-------------------|
| John | Doe | 10000 |
| Jane | Smith | 15000 |
In diesem Fall berechnet die skalare Unterabfrage einmal das Durchschnittsgehalt und die äußere Abfrage berechnet die Differenz des Gehalts jedes Mitarbeiters zum Durchschnitt.
Anwendungsfälle für verschachtelte Abfragen
Verschachtelte Abfragen oder Unterabfragen sind leistungsstarke Instruments in SQL, mit denen sich eine Vielzahl komplexer Herausforderungen beim Datenabruf lösen lassen. Hier sind einige häufige Anwendungsfälle:
Datenfilterung
Mit verschachtelten Abfragen können Ergebnisse basierend auf Werten gefiltert werden, die aus einer anderen Tabelle abgeleitet wurden.
Beispiel: Finden Sie Mitarbeiter, deren Gehalt über dem Durchschnittsgehalt ihrer jeweiligen Abteilung liegt.
SELECT first_name, last_name, wage
FROM workers e1
WHERE wage > (SELECT AVG(wage) FROM workers e2 WHERE e1.department_id = e2.department_id);
Berechnen von Aggregaten
Sie können berechnen Combination in einer verschachtelten Abfrage und verwenden Sie diese Ergebnisse in der äußeren Abfrage.
Beispiel: Rufen Sie Abteilungen mit einem Durchschnittsgehalt ab, das über dem Gesamtdurchschnittsgehalt liegt.
SELECT department_id, AVG(wage) AS average_salary
FROM workers
GROUP BY department_id
HAVING AVG(wage) > (SELECT AVG(wage) FROM workers);
Bedingte Logik
Mit verschachtelten Abfragen können Sie bedingte Logik in Ihre SQL-Anweisungen implementieren.
Beispiel: Hear Sie Mitarbeiter auf, die zu Abteilungen in einer bestimmten Stadt gehören.
SELECT first_name, last_name
FROM workers
WHERE department_id IN (SELECT department_id FROM departments WHERE metropolis = 'New York');
Korrelierte Unterabfragen für Berechnungen auf Zeilenebene
Korrelierte Unterabfragen ermöglichen Berechnungen auf Zeilenebene basierend auf Werten aus der aktuellen Zeile in der äußeren Abfrage.
Beispiel: Erhalten Sie eine Liste von Produkten mit einem höheren Preis als dem Durchschnittspreis von Produkten in der gleichen Kategorie.
SELECT product_name, value
FROM merchandise p1
WHERE value > (SELECT AVG(value) FROM merchandise p2 WHERE p1.category_id = p2.category_id);
Unterschiede zwischen verschachtelten Abfragen und anderen SQL-Abfragen
Sehen wir uns nun den Unterschied zwischen verschachtelten Abfragen und anderen SQL-Abfragen an:
Besonderheit | Verschachtelte Abfragen | Verknüpfungen | Einfache Abfragen |
---|---|---|---|
Definition | Eine Abfrage, die in eine andere Abfrage eingefügt ist | Kombiniert Zeilen aus zwei oder mehr Tabellen basierend auf einer verknüpften Spalte | Eine einzelne SQL-Anweisung, die Daten abruft |
Ausführung | Führt die innere Abfrage für jede Zeile aus, die von der äußeren Abfrage verarbeitet wird. | Wird gleichzeitig für alle Zeilen aus beiden Tabellen ausgeführt | Wird unabhängig und ohne Abhängigkeiten ausgeführt |
Anwendungsfall | Nützlich für komplexe Berechnungen und Filterung basierend auf einer anderen Abfrage | Best zum Kombinieren verwandter Daten aus mehreren Tabellen | Geeignet für den einfachen Datenabruf |
Leistung | Kann aufgrund der wiederholten Ausführung der inneren Abfrage zu einer Leistungseinbuße führen | Im Allgemeinen effizienter, da die Daten in einem Durchgang verarbeitet werden | Am schnellsten für den einfachen Datenabruf |
Komplexität | Kann komplex und schwer lesbar werden | Kann auch komplex sein, ist aber normalerweise klarer, wenn explizite Beziehungen vorliegen | Einfach und leicht verständlich |
Datenabhängigkeit | Die innere Abfrage kann vom Ergebnis der äußeren Abfrage abhängen | Daten aus verknüpften Tabellen sind voneinander unabhängig | Die abgerufenen Daten sind unabhängig, es sind keine Unterabfragen beteiligt |
Beispiel | SELECT first_name FROM workers WHERE wage > (SELECT AVG(wage) FROM workers); |
SELECT e.first_name, d.department_name FROM workers e JOIN departments d ON e.department_id = d.department_id; |
SELECT * FROM workers; |
Häufige Fehler bei verschachtelten Abfragen
Obwohl verschachtelte Abfragen unglaublich nützlich sein können, bergen sie auch Fallstricke. Hier sind einige häufige Fehler, auf die Sie achten sollten:
Mehrere Zeilen zurückgeben
Eine skalare Unterabfrage muss einen einzelnen Wert zurückgeben. Wenn sie mehrere Zeilen zurückgibt, tritt ein Fehler auf.
Fehler:
SELECT first_name
FROM workers
WHERE wage = (SELECT wage FROM workers);
Lösung: Stellen Sie sicher, dass die innere Abfrage Aggregation oder Filterung verwendet, um einen einzelnen Wert zurückzugeben.
Leistungsprobleme
Verschachtelte Abfragen können manchmal zu Leistungsengpässen führen, insbesondere wenn sie für jede Zeile in der äußeren Abfrage ausgeführt werden.
Fehler: Verwenden einer verschachtelten Abfrage innerhalb einer großen äußeren Abfrage ohne Berücksichtigung der Auswirkungen auf die Leistung.
Lösung: Analysieren Sie Abfrageausführungspläne und ziehen Sie beim Umgang mit großen Datensätzen various Methoden wie Verknüpfungen in Betracht.
Unsachgemäße Verwendung von Klammern
Eine falsche Platzierung der Klammern kann zu unerwarteten Ergebnissen oder Fehlern führen.
Fehler:
SELECT first_name
FROM workers
WHERE wage > (SELECT AVG(wage) FROM workers WHERE department_id);
Lösung: Stellen Sie sicher, dass die Logik Ihrer Abfrage klar ist und dass Klammern zum Gruppieren von Bedingungen angemessen verwendet werden.
Keine Berücksichtigung von NULL-Werten
Verschachtelte Abfragen können unerwartete Ergebnisse erzeugen, wenn in den Daten NULL-Werte vorhanden sind.
SELECT first_name
FROM workers
WHERE wage > (SELECT AVG(wage) FROM workers WHERE department_id IS NOT NULL);
Lösung: Behandeln Sie NULL-Werte explizit mit Funktionen wie COALESCE
um unbeabsichtigtes Filtern zu vermeiden.
Abschluss
Verschachtelte SQL-Abfragen, auch Unterabfragen genannt, sind sehr nützlich, um hochkomplexe Datenabrufvorgänge effizient durchzuführen. Sie können eine Abfrage in eine andere einbetten, um Berechnungen an Daten durchzuführen, die allein durch einfache Abfragen nicht möglich sind. Kenntnisse über die vier Haupttypen dieser Abfragen sind hilfreich: einzeilige, mehrzeilige, korrelierte und skalare Unterabfragen. Indem Sie bewährte Methoden anwenden und einige häufige Fehler vermeiden, können Sie das volle Potenzial verschachtelter Abfragen ausschöpfen und so Ihre Datenbankverwaltung und -leistung verbessern.
Häufig gestellte Fragen
A. Eine verschachtelte Abfrage oder Unterabfrage ist eine SQL-Abfrage, die in eine andere Abfrage eingefügt wird. Das Ergebnis der inneren Abfrage wird von der äußeren Abfrage verwendet, um komplexe Daten abzurufen.
A. Zu den Haupttypen gehören einzeilige Unterabfragen, mehrzeilige Unterabfragen, korrelierte Unterabfragen und skalare Unterabfragen, die jeweils unterschiedlichen Anwendungsfällen dienen.
A. Verwenden Sie eine korrelierte Unterabfrage, wenn die innere Abfrage auf eine Spalte der äußeren Abfrage verweisen muss, um dynamische zeilenweise Auswertungen zu ermöglichen.
A. Ja, verschachtelte Abfragen können zu Leistungsproblemen führen, insbesondere wenn sie für jede Zeile in der äußeren Abfrage ausgeführt werden. Die Analyse von Ausführungsplänen und die Berücksichtigung von Alternativen wie Verknüpfungen können zur Verbesserung der Effizienz beitragen.