logo

SQL | S doložkou

Klauzule SQL WITH byla zavedena společností Oracle v databázi Oracle 9i release 2. Klauzule SQL WITH vám umožňuje pojmenovat blok dílčího dotazu (proces nazývaný také refaktoring dílčího dotazu), na který lze odkazovat na několika místech v hlavním dotazu SQL.

  • Klauzule se používá k definování dočasného vztahu tak, že výstup tohoto dočasného vztahu je k dispozici a je používán dotazem spojeným s klauzulí WITH.
  • Dotazy, které mají přidruženou klauzuli WITH, lze také zapisovat pomocí vnořených poddotazů, ale tím se zvyšuje složitost čtení/ladění dotazu SQL.
  • Klauzule WITH není podporována všemi databázovými systémy.
  • S názvem přiřazeným k dílčímu dotazu se zachází, jako by se jednalo o vložený pohled nebo tabulku
  • Klauzule SQL WITH byla zavedena společností Oracle v databázi Oracle 9i release 2.

Syntax:

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



V tomto dotazu se klauzule WITH používá k definování dočasného vztahu dočasná tabulka, která má pouze 1 atribut averageValue. averageValue obsahuje průměrnou hodnotu sloupce Attr1 popsanou ve vztahu Tabulka. Příkaz SELECT, který následuje po klauzuli WITH, vytvoří pouze ty n-tice, kde je hodnota Attr1 ve vztahu Tabulka větší než průměrná hodnota získaná z příkazu klauzule WITH.

Poznámka: Při provádění dotazu s klauzulí WITH je nejprve vyhodnocen dotaz uvedený v klauzuli a výstup tohoto vyhodnocení je uložen v dočasné relaci. Poté se nakonec provede hlavní dotaz spojený s klauzulí WITH, který použije vytvořený dočasný vztah.

Dotazy

Příklad 1: Najděte všechny zaměstnance, jejichž plat je vyšší než průměrný plat všech zaměstnanců.
Název vztahu: Zaměstnanec

ID zaměstnance název Plat
100011 Kovář 50 000
100022 Účtovat 94 000
100027 Sám 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ýstup:

ID zaměstnance název Plat
100022 Účtovat 94 000
100845 Walden 80 000

Vysvětlení: Průměrný plat všech zaměstnanců je 70591. Všichni zaměstnanci, jejichž plat je vyšší než získaný průměr, tedy leží ve výkonové relaci.

Příklad 2: Najděte všechny letecké společnosti, kde je celkový plat všech pilotů v dané letecké společnosti vyšší než průměr celkového platu všech pilotů v databázi.

Název vztahu: Pilot

ID zaměstnance Letecká linka název Plat
70007 Airbus 380 Kim 60 000
70002 Boeing Laura 20 000
10027 Airbus 380 Vůle 80050
10778 Airbus 380 Warren 80780
115585 Boeing Kovář 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ýstup:

java převést celé číslo na řetězec
Letecká linka
Airbus 380

Vysvětlení: Celkový plat všech pilotů Airbusu 380 = 298 830 a Boeingu = 45000. Průměrný plat všech pilotů v tabulce Pilot = 57305. Protože pouze celkový plat všech pilotů Airbusu 380 je větší než dosažený průměrný plat, tak Airbus 380 leží ve výkonovém vztahu.

Důležité body:

  • Klauzule SQL WITH je vhodná při použití se složitými příkazy SQL, spíše než s jednoduchými
  • Umožňuje také rozdělit složité dotazy SQL na menší, což usnadňuje ladění a zpracování složitých dotazů.
  • Klauzule SQL WITH je v podstatě náhradou za normální poddotaz.