V softwarové inženýrství, to je běžná praxe pokyny skupiny je tak malé a snadno srozumitelné celky—konkrétně funkce nebo metody. Díky tomu je Kód opakovaně použitelný a zlepšuje čitelnost.
přestože SQL má také funkce a postupy, nejsou správnými nástroji pro vytváření snadno srozumitelných a opakovaně použitelných jednotek. V SQL nejsou funkce ani postupy prvotřídními občany stejným způsobem jako subqueries.0 stavební blok SQL jsou queries1-ne instrukce.,
aby byly dotazy opakovaně použitelné, představil SQL-92 zobrazení. Po vytvoření má pohled název v databázovém schématu, takže ostatní dotazy jej mohou použít jako tabulku.
SQL: 1999 přidal with
klauzuli definovat „prohlášení scoped views“. Nejsou uloženy v databázovém schématu: místo toho jsou platné pouze v dotazu, do kterého patří. To umožňuje zlepšit strukturu prohlášení bez znečišťování globálního jmenného prostoru.,
Syntax
with
klauzule je, jednoduše řečeno, volitelný prefix select
:2
WITH query_name (column_name1, ...) AS (SELECT ...) SELECT ...
syntaxe po klíčové slovo with
je stejné jako pro create view
: začíná se dotaz jméno a optionally3 a v závorce jména sloupců vrátí. Klíčové slovo as
konečně zavádí samotnou definici (dotaz) – opět v závorkách.,
With
není samostatný příkaz jako create view
je: musí následovat select
. Tento dotaz (a subqueries, který obsahuje) může odkazovat na právě definovaný název dotazu v klauzuli from
.
jeden with
klauzule může zavést více dotazu jmen, oddělte je čárkou (with
klíčové slovo se neopakuje)., Každý z těchto dotazů může odkazovat k dotazu jména dříve definovány v rámci stejné with
clause4 (často opomíjené pravidlo—viz Kompatibilita):
WITH query_name1 AS ( SELECT ... ) , query_name2 AS ( SELECT ... FROM query_name1 ... )SELECT ...
Dotaz názvy definovány pomocí with
maska stávajících tabulek nebo zobrazení se stejným názvem.5
důležité informace o Výkonu
Většina databází proces with
-dotazy stejným způsobem, že se proces zobrazení: mají nahradit odkaz na dotaz o jeho definici a optimalizovat celkový dotaz.,
PostgreSQL databáze byla jiná než verze 12: optimalizované každý with
dotaz a hlavní prohlášení na sobě nezávislé.
Pokud je dotazwith
odkazován vícekrát, některé mezipaměti databází (tj.
Přečtěte si více o tom v klauzuli „with
: dopady na výkon“.
vlastním jménem
živím se školením, dalšími službami souvisejícími s SQL a prodejem své knihy. Další informace naleznete na https://winand.at/.,
Případy Použití
-
Gramotný SQL
-
Unit testy na přechodné data
-
Přiřadit názvy sloupců bez známé jméno.
Kompatibilita
with
klauzule byla zavedena s SQL:1999 jako soubor volitelných funkcí. Opuštění recursive
varianta stranou, funkce jsou T121 pro top-level with
doložky a T122 pro with
doložky v poddotazů.
základní funkce with
je dobře podporována., Jedinou oblastí, kde se produkty chovají jinak, je rozlišení názvu. Je zvláště pozoruhodné, že with
je často zacházeno jako with recursive
.6 jemnější nedostatky jsou vztahující se na kvalifikované názvy tabulek (schema.table
nemůže odkazovat na with
dotaz)7 a názory, používá se v rozsahu with
dotazy (dotaz v zobrazení není „vidět“ vnější with
doložka).,8
odpovídající alternativy
pohledy mohou pokrýt některé případy použití. To však může snadno vést k nepřiměřenému počtu názorů („znečištění jmenného prostoru“). V těchto případech jsou subqueries často lepší volbou.
Proprietární Rozšíření
s jako DML prefix (PostgreSQL, SQL Server, SQLite)
Některé databáze akceptovat with
jako prefix pro příkazy DML (docs: PostgreSQL, SQL Server, SQLite).,
SQL Server můžete také použít with
dotaz jako cíl pro příkazy DML (v podstatě staví aktualizovatelný pohled).
Funkce s (Oracle)
Databáze Oracle podporuje funkci a postup prohlášení v with
doložka od verze 12cR1 (dokumentace).
DML v s (PostgreSQL)
Počínaje 9.1, databáze PostgreSQL podporuje příkazy DML (insert
update
delete
) v with
dotazy (dokumentace)., Při použití klauzule returning
příkazu DML dotaz with
skutečně vrací data (např. právě Vložené řádky).