Unie (SQL)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 16. března 2022; kontroly vyžadují 2 úpravy .

V SQL se operátor UNION používá ke spojení dvou sad řádků vrácených dotazy SQL. Oba dotazy musí vracet stejný počet sloupců a sloupce se stejným pořadovým číslem musí mít kompatibilní datové typy . Výsledek obdrží strukturu (názvy a typy sloupců) prvního (levého) dotazu, to znamená, že operace není symetrická.

Při kombinování více dotazů za sebou se výsledek počítá postupně zleva doprava.

Tento operátor byl popsán v prvním SQL standardu - SQL/89 [1] .

Syntaxe

Operátor je uveden mezi požadavky. Ve zjednodušené podobě to vypadá takto:

< dotaz 1 > UNION [ VŠECHNY ] < dotaz 2 > UNION [ VŠE ] < dotaz 3 > .....;

Ve výchozím nastavení jsou všechny duplicitní položky automaticky skryty, pokud není použit výraz UNION ALL.

Je třeba poznamenat, že UNIONsamo o sobě nezaručuje pořadí řádků. Řádky z druhého dotazu se mohou objevit na začátku, na konci nebo se dokonce smísit s řádky z prvního dotazu. V případech, kdy je vyžadována konkrétní objednávka, je třeba použít výraz ORDER BY.

Podmínky použití

Používání operátora se řídí dvěma hlavními pravidly UNION:

  • počet a pořadí sloupců, které mají být extrahovány, se musí shodovat ve všech kombinovaných dotazech;
  • datové typy v příslušných sloupcích musí být kompatibilní.

Datové typy sloupců, ze kterých jsou data načítána v kombinovaných dotazech, nemusí být přesně stejné, ale musí být kompatibilní prostřednictvím implicitního převodu. Pokud se datové typy liší, pak je výsledný datový typ určen na základě pravidel priority datových typů (pro konkrétní DBMS). Pokud se typy shodují, ale liší se přesností, měřítkem nebo délkou, je výsledek určen na základě pravidel použitých pro kombinování výrazů (pro konkrétní DBMS) [2] . Typy jiné než ANSI, jako jsou DATA a BINARY, by se normálně měly shodovat s jinými sloupci stejného nestandardního typu [3] .

V Microsoft SQL Server musí být sloupce datového typu XML ekvivalentní. Všechny sloupce musí mít buď typ definovaný ve schématu XML, nebo musí být bez typu. Typované sloupce musí odkazovat na stejnou kolekci schémat XML [2] .

Dalším omezením kompatibility je zakázání hodnot null (NULL) v libovolném sloupci spojení a tyto hodnoty musí být také zakázány pro všechny odpovídající sloupce v jiných dotazech na spojení, protože hodnoty null (NULL) jsou zakázány s hodnotou NOT NULL. omezení. Také nemůžete použít UNION v poddotazech a nemůžete použít agregační funkce v klauzuli SELECT dotazu v unii (většina DBMS však tato omezení ignoruje) [3] .

Aplikace

UNIONmůže být velmi užitečné v aplikacích pro datové sklady, kde jsou tabulky zřídka dokonale normalizovány . Jednoduchý příklad: v databázi jsou tabulky sales2005a sales2006, které mají identickou strukturu, ale jsou kvůli výkonu odděleny. Slovní dotaz UNIONumožňuje kombinovat výsledky z obou tabulek.

Za zmínku také stojí, že UNION ALLfunguje rychleji než jen UNION, protože ve výchozím nastavení se při použití operátoru UNIONprovádí dodatečná eliminace duplicit, ale při jeho použití tomu UNION ALLtak není [4] .

Příklady

Použití UNION při výběru ze dvou tabulek

Jsou uvedeny dvě tabulky:

prodej 2005
osoba množství
Ivane 1000
Alexeji 2000
Sergeji 5000
prodej 2006
osoba množství
Ivane 2000
Alexeji 2000
Petr 35 000

Při provádění následujícího dotazu:

( SELECT * FROM sales2005 ) UNION ( SELECT * FROM sales2006 );

je získána sada výsledků, ale pořadí řádků se může libovolně změnit, protože ORDER BYnebyl použit klíčový výraz:

osoba množství
Ivane 1000
Alexeji 2000
Ivane 2000
Sergeji 5000
Petr 35 000

V důsledku toho se zobrazí dva řádky s Ivanem, protože tyto řádky se liší v hodnotách ve sloupcích. Ale zároveň je ve výsledku pouze jeden řádek s Alexey, protože hodnoty ve sloupcích se zcela shodují.

Použití UNION ALL při výběru ze dvou tabulek

Použití UNION ALLdává jiný výsledek, protože duplikáty nejsou skryté. Vyřízení požadavku:

( SELECT * FROM sales2005 ) UNION ALL ( SELECT * FROM sales2006 );

poskytne následující výsledek zobrazený bez řazení kvůli absenci výrazu ORDER BY:

osoba množství
Ivane 1000
Ivane 2000
Alexeji 2000
Alexeji 2000
Sergeji 5000
Petr 35 000

Použití UNION při výběru z jedné tabulky

Podobně je možné spojit dva různé dotazy ze stejné tabulky (ačkoli místo toho se zpravidla potřebné parametry spojí do jednoho dotazu pomocí klíčových slov AND a OR v klauzuli WHERE):

( SELECT osoba , částka FROM sales2005 WHERE částka = 1000 ) UNION ( SELECT person , částka FROM sales2005 WHERE osoba jako 'Sergey' );

Výsledkem bude:

osoba množství
Ivane 1000
Sergeji 5000

Použití UNION jako vnějšího spojení

Můžete s ním UNIONtaké vytvářet úplné vnější spojení (někdy se používá, když není vestavěná přímá podpora pro vnější spojení):

( SELECT * FROM zaměstnance LEFT JOIN oddělení ON zaměstnanec . DepartmentID = oddělení . DepartmentID ) UNION ( SELECT * FROM zaměstnance RIGHT JOIN oddělení ON zaměstnanec . DepartmentID = oddělení . DepartmentID );

Zároveň je ale třeba připomenout, že to stále není totéž jako operátor JOIN.

Viz také

Poznámky

  1. SQL/89 Database Language Archived 2. prosince 2018 na Wayback Machine  (ruština)
  2. 1 2 UNION (Transact-SQL) Archivováno 23. září 2010 na Wayback Machine  (ruština)
  3. 1 2 Použití klauzule UNION Archivováno 9. února 2010 na Wayback Machine  (ruština)
  4. Query Optimization Archived 14. dubna 2009 na Wayback Machine  (ruština)

Položka 4 – nefunkční odkaz (stav k 11.08.2012)

Odkazy

obecný popis Implementace v MS SQL Server Implementace v MySQL Implementace v PostgreSQL Implementace v Oracle Implementace v Informixu