LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> MySQL (33) - Příkaz UNION

Tabulky všech zemí, spojte se! Nebojte, staré časy se nevrací, to jen v dnešním díle seriálu o MySQL bude řeč o spojování pomocí příkazu UNION.

12.8.2005 08:00 | Petr Zajíc | Články autora | přečteno 42012×

Komerční sdělení: Pořádáme Kurzy MySQL

... aneb tabulky všech zemí, spojte se. Dnes bude řeč o technice spojování více sad záznamů do jedné, chcete-li si to nějak představit. Může se jednat například o situaci, kdy budete chtít spojit současná data s historickými záznamy a podobně. Leč jako vždy, nejprve trocha teorie.

Příkaz UNION

Příkaz pro spojení dvou sad v jednu v MySQL dlouho chyběl. K nelibosti vývojářů, kteří na tuto techniku byli zvyklí z jiných DBMS. Od verze 4.0.0 je však tato funkce k dispozici. Jde o to, že se výsledky jednoho příkazu SELECT spojí s výsledky jiného příkazu, takže to naoko vypadá, jako by ani nepocházely z více zdrojů. Mohlo by to vypadat nějak takto:

select id, nazev, autor from knihy union select id, nazev, autor from stare_knihy

Platí přitom, že obě "zdrojové" sady záznamů musejí mít především stejný počet polí. Takže, následující příkaz skončí chybou "The used SELECT statements have a different number of columns":

select id, nazev, autor from knihy union select id, nazev from stare_knihy

protože se pokoušíme spojit sadu s třemi sloupci s jinou sadou, která má sloupce pouze dva. Aby to nebylo až tak jednoduchá, tak navíc platí, že spojované sloupce by měly mít stejný datový typ. Pokusíte-li se spojit dvě sady záznamů a sloupce nebudou mít stejný datový typ, operace UNION selže.

Abych nemluvil pouze o omezeních - JE možné spojit dvě sady záznamů, kde v každé z nich se spojovaná pole jinak jmenují (samozřejmě za předpokladuů uvedených výše). To znamená, že následující příkaz by mohl projít:

select id, nazev, autor from knihy union select stare_id, stary_nazev, stary_autor from stare_knihy

Nabízí se otázka - jak se v takovém případě budou jmenovat sloupce výsledné sady záznamů? Odpověď je jednoduchá - budou se jmenovat tak, jak se jmenují sloupce první sady. V našem případě tedy id, nazev a autor.

Sloupce v příkazu SELECT nemusíte vyjmenovávat, můžete použít hvězdičkovou konvenci. Takže, i toto může být platný UNION, pokud mají tabulky stejnou strukturu:

select * from knihy union select * from stare_knihy

Před tímto přístupem bych Vás však měl spíše varovat, než abych Vám jej doporučoval. Problém je v tom, že stačí změnit strukturu libovolné z oněch dovu tabulek a celé to přestane pracovat. Takže zásada - při použití příkazu UNION více než kdy jindy vyjmenovávejte jednotlivé sloupce.

Doposud jsem mluvil pouze o spojování dvou tabulek. Příkazem UNIOIN však můžete spojit prakticky libovolný počet sad, takže se klíčové slovo UNION smí opakovat.

Problémy a omezení

Duplicity a UNION

Existuje jeden problém, s nímž se začátečníci používající příkaz UNION někdy potýkají, a tím problémem je, že UNION jako výchozí chování odstraňuje duplicitní řádky z výsledné sady záznamů. A to bez ohledu na to, zda duplicita pochází z jedné tabulky, nebo z různých tabulek. Toto chování Vám za prvé může vadit, a za druhé (logicky) zabere nějaký čas. Chcete-li se obojímu vyhnout, použijte namísto příkazu UNION příkaz UNION ALL.

select id, nazev, autor from knihy union all select id, nazev, autor from stare_knihy

V takovém případě máte jednak jistotu, že duplicitní řádky budou vráceny, a jednak dobrý pocit, že příkaz proběhne o nějakou tu milisekundu rychleji než při použití "klasického" příkazu UNION. A většinou je to to, co potřebujete.

UNION a řazení záznamů

Výsledky vrácené příkazem UNION lze řadit tak, jako lze řadit každou jinou sadu záznamů, tedy pomocí klauzule ORDER BY v závěru příkazu. Mějme však na paměti, že tento příkaz nejprve spojí obě (či všechny) záznamy a teprve pak to celé seřadí. To je většinou to, co očekáváme. Pokud byste chtěli nejprve řadit a pak spojovat, mám pro Vás dobrou zprávu - i to MySQL umí. Podívejte se do manuálu, je to tam popsáno.

Pozn.: Za svou praxi jsem to ale ještě nepotřeboval, takže to berte spíše jako perličku než jako něco, co byste měli doopravdy znát.

Použití

Spojení aktuální a archivní tabulky

Čas od času je k vidění technika, kdy se data zapsaná do nějaké tabulky po čase rozdělí - "čerstvá" data zůstávají v aktuální tabulce, "stará" data jsou pak v tabulce archivní. Pokud má archiv stejnou strukturu jako "živá" tabulka a potřebujeme data z obou, je UNION (resp. UNION ALL) to pravé ořechové pro náš dotaz. Tato technika bývá k vidění zejména u tabulek, které jsou velké a často modifikované na konci (napříkad se může jednat o časově závislá statistická data).

Tvorba virtuální tabulky

Někdy potřebujeme (například do poddotazu a podobně) sestavit a použít virtuální, neexistující tabulku s více než jedním řádkem. V takovém případě může být mnohem rychlejší než vytvářet dočasnou tabulku použít něco jako:

select 1 as cislo union select 2 union select 3 union select 4 union select 5

(tabulka může mít samozřejmě i více než jeden sloupec). Jelikož MySQL s takovou "sadou" zachází jako s každou jinou, může to nejen hodit, ale může to být rovněž velmi rychlé řešení.

Vzdáleně související data

Termínem "vzdáleně související data" mám na mysli taková data, která je obtížné nebo nemožné spojit pomocí relací. Může se jednat o data pro nějaký složitý kombinovaný report, o data obsahující jak podrobnosti tak i souhrny a podobně. I tady může být použití UNION namístě. Obyčejně se v takovém případě ještě dělá to, že se jeden sloupec vyhradí na identifikaci původní tabulky, protože to může být potřeba. Mám ny mysli něco jako:

select id, cas, 'vysledky' as tabulka from vysledky union all select id, cas, 'rekordy' as tabulka from rekordy

Jistě existují i další, specifičtější příklady použití UNION. Pokud o nějakém víte a chcete se s námi o něj podělit, napište to do diskuse pod článkem.

Verze pro tisk

pridej.cz

 

DISKUZE

Množinový rozdíl 15.1.2006 11:09 Perun
L Re: Množinový rozdíl 15.1.2006 14:09 Petr Zajíc
původ řádku 24.5.2007 16:58 sin
  L Re: původ řádku 21.7.2009 17:08 Altosch




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

15.4.2017 15:20 /František Kučera

Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).


Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

27.2.2017 22:12 /František Kučera
Pozvánka na 137. sraz OpenAlt – Praha: Tentokrát jsme si pro vás připravili neobvyklou akci. Ve středu 1.3. v 17:30 nás přivítá sdružení CZ.NIC ve svých prostorách v Milešovské ulici číslo 5 na Praze 3, kde si pro nás připravili krátkou prezentaci jejich činnosti. Následně navštívíme jejich datacentrum pod Žižkovskou věží. Provedou nás prostory, které jsou běžnému smrtelníkovi nedostupné!
Po ukončení prohlídky se všchni odebereme do hostince U vodoucha, Jagelonská 21, Praha 3 pochutnat si na některém z vybraných piv či dát si něco na zub. Rezervaci máme od 19:30, heslo je OpenAlt.
Ale pozor! Do prostor datového centra máme omezený přístup, dostane se tam pouze 10 lidí! Takže kdo přijde dříve, ten má přednost, a občanky s sebou! Kdo nebude chtít na prohlídku datového centra, může se pomalu přesunout do hostince U vodoucha a u nepřeberné nabídky piv počkat na ostatní.
Přidat komentář

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

8.1.2017 17:51 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 19. ledna od 18:30 v pražském hackerspacu Brmlab. Tentokrát je tématem srazu ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. K vidění bude mechanická klávesnice dasKeyboard, trackball Logitech nebo grafický tablet (a velký touchpad) Wacom. Přineste i vy ukázat svoje zajímavé klávesnice a další HW. V 18:20 je sraz před budovou, v 18:30 jdeme společně dovnitř, je tedy dobré přijít včas. Podle zájmu se později přesuneme do nějaké restaurace v okolí.
Přidat komentář

1.12.2016 22:13 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.
Komentářů: 1

4.9.2016 20:13 /Pavel `Goldenfish' Kysilka
PR: Dne 22.9.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, provozování ERP v cloudu, o hostování různých typů softwaru, ale třeba i o zálohování dat nabízeném podnikům formou služby.
Přidat komentář

1.9.2016 11:27 /Honza Javorek
Česká konference o Pythonu, PyCon CZ, stále hledá přednášející skrz dobrovolné přihlášky. Máte-li zajímavé téma, neváhejte a zkuste jej přihlásit, uzávěrka je již 12. září. Konference letos přijímá i přednášky v češtině a nabízí pomoc s přípravou začínajícím speakerům. Řečníci mají navíc vstup zadarmo! Více na webu.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

17.4.2017 19:15 / Jakub shoop
chyba

7.4.2017 15:43 / Som
foreign car repair

31.3.2017 18:33 / David Ostrovsky
Dotazník na obeznámenost s hummusem.

24.3.2017 11:54 / Hui
country cottages

16.3.2017 16:33 / BezvaDesign.cz
Re: Hledám grafika do teamu

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze