logo

SQL | Z klauzulą

Klauzula SQL WITH została wprowadzona przez firmę Oracle w bazie danych Oracle 9i w wersji 2. Klauzula SQL WITH umożliwia nadanie blokowi podzapytania nazwy (proces zwany także refaktoryzacją podzapytania), do której można się odwoływać w kilku miejscach głównego zapytania SQL.

  • Klauzula służy do definiowania relacji tymczasowej w taki sposób, że wynik tej relacji tymczasowej jest dostępny i jest używana przez zapytanie powiązane z klauzulą ​​WITH.
  • Zapytania, które mają powiązaną klauzulę WITH, można również pisać przy użyciu zagnieżdżonych podzapytań, ale powoduje to większą złożoność odczytu/debugowania zapytania SQL.
  • Klauzula WITH nie jest obsługiwana przez wszystkie systemy baz danych.
  • Nazwa przypisana do zapytania podrzędnego jest traktowana tak, jakby była widokiem wbudowanym lub tabelą
  • Klauzula SQL WITH została wprowadzona przez firmę Oracle w bazie danych Oracle 9i w wersji 2.

Składnia:

WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table) SELECT Attr1 FROM Table, temporaryTable WHERE Table.Attr1>tabela tymczasowa.średniawartość;>



3 miesiące

W tym zapytaniu klauzula WITH służy do zdefiniowania tymczasowej relacji TemporaryTable, która ma tylko 1 atrybut AverageValue. AverageValue przechowuje średnią wartość kolumny Attr1 opisaną w relacji Tabela. Instrukcja SELECT występująca po klauzuli WITH zwróci tylko te krotki, w których wartość Attr1 w relacji Table jest większa niż średnia wartość uzyskana z instrukcji klauzuli WITH.

Notatka: Kiedy wykonywane jest zapytanie z klauzulą ​​WITH, najpierw oceniane jest zapytanie wymienione w klauzuli, a wynik tej oceny jest przechowywany w relacji tymczasowej. Następnie zostaje ostatecznie wykonane główne zapytanie powiązane z klauzulą ​​WITH, które wykorzystuje utworzoną tymczasową relację.

Zapytania

znak na int w Javie

Przykład 1: Znajdź wszystkich pracowników, których wynagrodzenie jest wyższe niż średnie wynagrodzenie wszystkich pracowników.
Nazwa relacji: Pracownik

Dowód pracownika Nazwa Wynagrodzenie
100011 Kowal 50000
100022 Rachunek 94000
100027 samego siebie 70550
100845 Waldena 80000
115585 Eryk 60000
1100070 Kate 69000

Zapytanie SQL:

WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee) SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary>tabela tymczasowa.średniaWartość;>

Wyjście:

Dowód pracownika Nazwa Wynagrodzenie
100022 Rachunek 94000
100845 Waldena 80000

Wyjaśnienie: Przeciętne wynagrodzenie wszystkich pracowników wynosi 70591. Zatem wszyscy pracownicy, których wynagrodzenie jest wyższe od uzyskanej średniej, mieszczą się w relacji produkcji.

Przykład 2: Znajdź wszystkie linie lotnicze, w których łączne wynagrodzenie wszystkich pilotów w tej linii jest wyższe niż średnia łącznego wynagrodzenia wszystkich pilotów w bazie danych.

Nazwa relacji: Pilot

Java elseif
Dowód pracownika Linia lotnicza Nazwa Wynagrodzenie
70007 Airbusa 380 Kima 60000
70002 Boeinga Laura 20000
10027 Airbusa 380 Będzie 80050
10778 Airbusa 380 Królikarnia 80780
115585 Boeinga Kowal 25000
114070 Airbusa 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>linia lotniczaŚrednia.avgWynagrodzenie;>

Wyjście:

Linia lotnicza
Airbusa 380

Wyjaśnienie: Łączne wynagrodzenie wszystkich pilotów Airbusa 380 = 298 830 i Boeinga = 45000. Średnie wynagrodzenie wszystkich pilotów w tabeli Pilot = 57305. Ponieważ tylko łączne wynagrodzenie wszystkich pilotów Airbusa 380 jest większe od przeciętnego uzyskiwanego wynagrodzenia, zatem 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
  • Umożliwia także podzielenie złożonych zapytań SQL na mniejsze, co ułatwia debugowanie i przetwarzanie złożonych zapytań.
  • Klauzula SQL WITH jest w zasadzie zamiennikiem zwykłego zapytania podrzędnego.