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 47904×
... 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
|
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|