logo

SQL | S doložkou

Klauzula SQL WITH bola zavedená spoločnosťou Oracle v databáze Oracle 9i release 2. Klauzula SQL WITH vám umožňuje pomenovať blok poddotazu (proces nazývaný aj refaktoring poddotazu), na ktorý možno odkazovať na niekoľkých miestach v rámci hlavného dotazu SQL.

  • Klauzula sa používa na definovanie dočasného vzťahu tak, že výstup tohto dočasného vzťahu je dostupný a používa ho dotaz, ktorý je spojený s klauzulou WITH.
  • Dotazy, ktoré majú priradenú klauzulu WITH, možno písať aj pomocou vnorených poddotazov, ale tým sa zvyšuje zložitosť čítania/ladenia dotazu SQL.
  • Klauzula WITH nie je podporovaná všetkými databázovými systémami.
  • S názvom priradeným poddotazu sa zaobchádza, ako keby to bol vložený pohľad alebo tabuľka
  • Klauzula SQL WITH bola zavedená spoločnosťou Oracle v databáze Oracle 9i release 2.

Syntax:

WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table) SELECT Attr1 FROM Table, temporaryTable WHERE Table.Attr1>dočasnáTabuľka.averageValue;>



čiastočná závislosť

V tomto dotaze sa klauzula WITH používa na definovanie dočasného vzťahu dočasná tabuľka, ktorá má iba 1 atribút averageValue. averageValue obsahuje priemernú hodnotu stĺpca Attr1 opísanú vo vzťahu Tabuľka. Príkaz SELECT, ktorý nasleduje za klauzulou WITH, vytvorí len tie n-tice, ktorých hodnota Attr1 vo vzťahu Table je väčšia ako priemerná hodnota získaná z príkazu klauzuly WITH.

Poznámka: Keď sa vykoná dotaz s klauzulou WITH, najskôr sa vyhodnotí dotaz uvedený v klauzule a výstup tohto vyhodnotenia sa uloží v dočasnom vzťahu. Potom sa nakoniec vykoná hlavný dotaz spojený s klauzulou WITH, ktorý použije vytvorený dočasný vzťah.

Dotazy

js pole

Príklad 1: Nájdite všetkých zamestnancov, ktorých plat je vyšší ako priemerný plat všetkých zamestnancov.
Názov vzťahu: zamestnanec

Identifikačné číslo zamestnanca názov Plat
100011 Smith 50 000
100022 Bill 94 000
100027 Sám seba 70550
100845 Walden 80 000
115585 Erik 60 000
1100070 Kate 69 000

SQL dotaz:

WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee) SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary>dočasnéTable.averageValue;>

Výkon:

Identifikačné číslo zamestnanca názov Plat
100022 Bill 94 000
100845 Walden 80 000

Vysvetlenie: Priemerná mzda všetkých zamestnancov je 70591. Vo výkonovej relácii teda ležia všetci zamestnanci, ktorých mzda je vyššia ako získaný priemer.

Príklad 2: Nájdite všetky letecké spoločnosti, ktorých celkový plat všetkých pilotov danej leteckej spoločnosti je vyšší ako priemer celkových platov všetkých pilotov v databáze.

Názov vzťahu: Pilot

koliesko myši sa neposúva správne
Identifikačné číslo zamestnanca letecká spoločnosť názov Plat
70007 Airbus 380 Kim 60 000
70002 Boeing Laura 20 000
10027 Airbus 380 Will 80050
10778 Airbus 380 Warren 80780
115585 Boeing Smith 25 000
114070 Airbus 380 Katy 78 000

SQL dotaz:

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;>

Výkon:

letecká spoločnosť
Airbus 380

Vysvetlenie: Celkový plat všetkých pilotov Airbusu 380 = 298 830 a Boeingu = 45000. Priemerný plat všetkých pilotov v tabuľke Pilot = 57305. Keďže iba celkový plat všetkých pilotov Airbusu 380 je väčší ako získaný priemerný plat, tak Airbus 380 leží vo výkonovom vzťahu.

Dôležité body:

  • Klauzula SQL WITH je dobrá, keď sa používa s komplexnými príkazmi SQL, a nie s jednoduchými
  • Umožňuje vám tiež rozdeliť zložité dotazy SQL na menšie, čo uľahčuje ladenie a spracovanie zložitých dotazov.
  • Klauzula SQL WITH je v podstate náhradou za normálny poddotaz.