SQL WITH clause został wprowadzony przez Oracle w bazie danych Oracle 9i release 2. Klauzula SQL WITH pozwala nadać blokowi podzapytań nazwę (proces zwany także refaktoryzacją podzapytań), do której można się odwoływać w kilku miejscach głównego zapytania SQL.
- klauzula jest używana do definiowania tymczasowej relacji, tak aby wyjście tej tymczasowej relacji było dostępne i jest używane przez zapytanie powiązane z klauzulą WITH.zapytania
- , które mają powiązaną klauzulę Z, mogą być również pisane za pomocą zagnieżdżonych zapytań podrzędnych, ale w ten sposób zwiększa się złożoność odczytu / debugowania zapytania SQL.
- z klauzulą nie jest wspierana przez wszystkie systemy bazodanowe.
- nazwa przypisana do podrzędnego zapytania jest traktowana tak, jakby był to Widok wbudowany lub tabela
- klauzula SQL WITH została wprowadzona przez Oracle w bazie danych Oracle 9i release 2.
składnia:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table), SELECT Attr1 FROM Table WHERE Table.Attr1 > temporaryTable.averageValue;
w tym zapytaniu, z klauzulą jest używana do definiowania tymczasowej relacji tymczasowa, która ma tylko 1 atrybut średnia. averageValue przechowuje średnią wartość kolumny Attr1 opisaną w tabeli relacji. Instrukcja SELECT, która następuje po klauzuli WITH, wytworzy tylko te krotki, w których wartość Attr1 w tabeli relacji jest większa niż średnia wartość uzyskana z instrukcji WITH.
Uwaga: Gdy zapytanie z klauzulą WITH jest wykonywane, najpierw zapytanie wymienione w klauzuli jest obliczane, a wynik tej oceny jest przechowywany w relacji tymczasowej. Następnie zostanie ostatecznie wykonane główne zapytanie powiązane z klauzulą WITH, które wykorzystałoby wytworzoną tymczasową relację.
zapytania
przykład 1: Znajdź wszystkich pracowników, których pensja jest wyższa niż średnia pensja wszystkich pracowników.
Nazwa relacji: Employee
EmployeeID | Name | Salary |
---|---|---|
100011 | Smith | 50000 |
100022 | Bill | 94000 |
100027 | Sam | 70550 |
100845 | Walden | 80000 |
115585 | Erik | 60000 |
1100070 | Kate | 69000 |
SQL Query:
WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee), SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary > temporaryTable.averageValue;
Output:
EmployeeID | Nazwa | wynagrodzenie |
---|---|---|
100022 | rachunek | 94000 |
100845 | Walden | 80000 |
Wyjaśnienie: średnie wynagrodzenie wszystkich pracowników wynosi 70591. Dlatego wszyscy pracownicy, których wynagrodzenie jest wyższe niż uzyskana średnia, leżą w relacji produkcji.
przykład 2: Znajdź wszystkie linie lotnicze, w których łączna pensja wszystkich pilotów w tej linii lotniczej jest większa niż średnia całkowita pensja wszystkich pilotów w bazie danych.
Nazwa relacji: Pilot
EmployeeID | Airline | Name | Salary |
---|---|---|---|
70007 | Airbus 380 | Kim | 60000 |
70002 | Boeing | Laura | 20000 |
10027 | Airbus 380 | Will | 80050 |
10778 | Airbus 380 | Warren | 80780 |
115585 | Boeing | Smith | 25000 |
114070 | Airbus 380 | Katy | 78000 |
zapytanie SQL:
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;
Wyjście:
Airbus 380
Wyjaśnienie: całkowite wynagrodzenie wszystkich pilotów Airbusa 380 = 298,830, a Boeing = 45000. Średnie wynagrodzenie wszystkich pilotów w tabeli Pilot = 57305. Ponieważ tylko łączna pensja wszystkich pilotów Airbusa 380 jest większa niż średnia uzyskana pensja, więc Airbus 380 leży w relacji wyjściowej.
ważne punkty:
- klauzula SQL WITH jest dobra, gdy jest używana ze złożonymi instrukcjami SQL, a nie prostymi
- pozwala również na rozbicie złożonych zapytań SQL na mniejsze, które ułatwiają debugowanie i przetwarzanie złożonych zapytań.
- SQL z klauzulą jest w zasadzie zamiennikiem zwykłego podpowiedzi.
autorem artykułu jest Mayank Kumar. Jeśli podoba Ci się GeeksforGeeks i chciałbyś wnieść swój wkład, możesz również napisać artykuł za pomocą contribute.geeksforgeeks.org lub wyślij swój artykuł na adres [email protected]. Zobacz swój artykuł pojawiający się na stronie głównej GeeksforGeeks i pomóż innym maniakom.