logo

SQL | WITH-Klausel

Die SQL WITH-Klausel wurde von Oracle in der Oracle 9i Release 2-Datenbank eingeführt. Mit der SQL WITH-Klausel können Sie einem Unterabfrageblock einen Namen geben (ein Prozess, der auch Unterabfrage-Refactoring genannt wird), auf den an mehreren Stellen in der Haupt-SQL-Abfrage verwiesen werden kann.

  • Die Klausel wird zum Definieren einer temporären Beziehung verwendet, sodass die Ausgabe dieser temporären Beziehung verfügbar ist und von der Abfrage verwendet wird, die der WITH-Klausel zugeordnet ist.
  • Abfragen, denen eine WITH-Klausel zugeordnet ist, können auch mithilfe verschachtelter Unterabfragen geschrieben werden. Dies erhöht jedoch die Komplexität beim Lesen/Debuggen der SQL-Abfrage.
  • Die WITH-Klausel wird nicht von allen Datenbanksystemen unterstützt.
  • Der der Unterabfrage zugewiesene Name wird so behandelt, als wäre es eine Inline-Ansicht oder Tabelle
  • Die SQL WITH-Klausel wurde von Oracle in der Oracle 9i Release 2-Datenbank eingeführt.

Syntax:

WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table) SELECT Attr1 FROM Table, temporaryTable WHERE Table.Attr1>temporaryTable.averageValue;>



In dieser Abfrage wird die WITH-Klausel verwendet, um eine temporäre Beziehung „temporaryTable“ zu definieren, die nur ein Attribut „averageValue“ hat. AverageValue enthält den Durchschnittswert der in der Beziehungstabelle beschriebenen Spalte Attr1. Die SELECT-Anweisung, die auf die WITH-Klausel folgt, erzeugt nur die Tupel, bei denen der Wert von Attr1 in der Beziehungstabelle größer ist als der Durchschnittswert, der aus der WITH-Klausel-Anweisung erhalten wird.

Notiz: Wenn eine Abfrage mit einer WITH-Klausel ausgeführt wird, wird zunächst die in der Klausel genannte Abfrage ausgewertet und die Ausgabe dieser Auswertung in einer temporären Beziehung gespeichert. Anschließend wird schließlich die mit der WITH-Klausel verknüpfte Hauptabfrage ausgeführt, die die erzeugte temporäre Beziehung verwenden würde.

Abfragen

Beispiel 1: Finden Sie alle Mitarbeiter, deren Gehalt über dem Durchschnittsgehalt aller Mitarbeiter liegt.
Name der Relation: Mitarbeiter

Angestellten ID Name Gehalt
100011 Schmied 50000
100022 Rechnung 94000
100027 Sich selbst 70550
100845 Walden 80000
115585 Erik 60000
1100070 Kate 69000

SQL-Abfrage:

WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee) SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary>temporaryTable.averageValue;>

Ausgabe:

Angestellten ID Name Gehalt
100022 Rechnung 94000
100845 Walden 80000

Erläuterung: Das durchschnittliche Gehalt aller Mitarbeiter beträgt 70591. Daher liegen alle Mitarbeiter, deren Gehalt über dem ermittelten Durchschnitt liegt, im Output-Verhältnis.

Beispiel 2: Finden Sie alle Fluggesellschaften, bei denen das Gesamtgehalt aller Piloten dieser Fluggesellschaft über dem Durchschnitt des Gesamtgehalts aller Piloten in der Datenbank liegt.

Name der Relation: Pilot

Angestellten ID Fluggesellschaft Name Gehalt
70007 Airbus 380 Kim 60000
70002 Boeing Laura 20000
10027 Airbus 380 Wille 80050
10778 Airbus 380 Labyrinth 80780
115585 Boeing Schmied 25000
114070 Airbus 380 Katy 78000

SQL-Abfrage:

WITH totalSalary(Airline, total) as (SELECT Airline, sum(Salary) FROM Pilot GROUP BY Airline), airlineAverage(avgSalary) as (SELECT avg(Salary) FROM Pilot ) SELECT Airline FROM totalSalary, airlineAverage WHERE totalSalary.total>airlineAverage.avgSalary;>

Ausgabe:

Fluggesellschaft
Airbus 380

Erläuterung: Das Gesamtgehalt aller Piloten von Airbus 380 = 298.830 und das von Boeing = 45.000. Durchschnittsgehalt aller Piloten in der Tabelle Pilot = 57305. Da nur das Gesamtgehalt aller Piloten von Airbus 380 höher ist als das erhaltene Durchschnittsgehalt, also Airbus 380 liegt im Leistungsverhältnis.

Wichtige Punkte:

  • Die SQL WITH-Klausel eignet sich gut für die Verwendung mit komplexen SQL-Anweisungen statt mit einfachen
  • Außerdem können Sie komplexe SQL-Abfragen in kleinere aufteilen, was das Debuggen und Verarbeiten komplexer Abfragen erleichtert.
  • Die SQL WITH-Klausel ist im Grunde ein direkter Ersatz für die normale Unterabfrage.