MySQL UNION – Kompletní návod
⚡ Chytré shrnutí
MySQL Funkce UNION kombinuje výsledky dvou nebo více dotazů SELECT do jedné konsolidované sady výsledků. Toto vysvětlení zahrnuje pravidla pro sloupce, která zajišťují platnost sjednocení, rozdíl mezi UNION DISTINCT a UNION ALL a příklady spuštěné v databázi myflixdb.
V čem je UNIE MySQL?
UNION je MySQL Operátor, který kombinuje výsledky z více dotazů SELECT do konsolidované sady výsledků. Řádky vrácené druhým dotazem jsou umístěny pod řádky vrácené prvním dotazem, čímž vznikne jeden vertikální seznam místo dvou samostatných.
Jediným požadavkem, aby to fungovalo, je, aby počet sloupců ve všech dotazech SELECT, které je třeba zkombinovat, byl stejný.
Předpokládejme, že máme dvě tabulky, jak je uvedeno níže.
Obě tabulky obsahují dva sloupce stejného typu, takže je lze sjednotit. Následující příklady kombinují přesně tyto dvě tabulky.
Proč používat UNION?
Předpokládejme, že v návrhu vaší databáze je chyba a používáte dvě různé tabulky určené pro stejný účel. Chcete tyto dvě tabulky sloučit do jedné a zároveň vynechat všechny duplicitní záznamy z cree...ping do nové tabulky. V takových případech můžete použít UNION.
Operátor je také užitečný při každodenní práci s reporty:
- Archidatová a živá data: Aktuální tabulku a archivní tabulku, které sdílejí stejné sloupce, lze vytvářet společně, aniž by bylo nutné je fyzicky sloučit.
- Několik zdrojů, jedna zpráva: Členové a filmy nebo prodeje ze dvou regionů lze pro rychlý přehled uvést v jednom výstupu.
- Kontroly migrace: Řádky ze staré a nové tabulky lze před odstraněním staré tabulky stohovat a porovnávat.
Sjednocení nenahrazuje operátor JOIN. UNION přidává řádky pod řádky, zatímco JOIN přidává sloupce vedle sloupců a toto rozlišení určuje, který operátor úloha volá.
MySQL Syntaxe a pravidla UNION
Nyní, když je účel jasný, podívejme se na tvar příkazu a pravidla, která databáze vynucuje.
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
Každou odborovou organizaci řídí tři pravidla:
- Stejný počet sloupců. Každý příkaz SELECT musí vrátit stejný počet sloupců, jinak MySQL vyvolá chybu 1222.
- Kompatibilní datové typy ve stejném pořadí. První sloupec prvního dotazu se porovnává se sloupcem jedním druhého, takže číslo by mělo odpovídat číslu a text by měl odpovídat textu.
- Jména pocházejí z prvního dotazu. Záhlaví výsledné sady se přebírá z prvního SELECTu, a proto tam patří jakýkoli alias.
An ORDER BY nebo LIMIT Klauzule umístěná na konci se vztahuje na kombinovaný výsledek, nikoli na jednu jeho větev, a musí odkazovat na názvy sloupců vygenerované prvním příkazem SELECT.
UNION DISTINCT vs. UNION ALL
Po zavedení pravidel zbývá rozhodnout, zda by duplicitní řádky měly přežít.
Kombinování tabulek pomocí funkce DISTINCT
Nyní vytvořme sjednocovací dotaz (UNION), který obě tabulky sloučí pomocí funkce DISTINCT.
SELECT column1, column2 FROM `table1` UNION DISTINCT SELECT column1, column2 FROM `table2`;
Zde se odstraní duplicitní řádky a vrátí se pouze jedinečné řádky.
Poznámka: MySQL používá klauzuli DISTINCT jako výchozí při provádění dotazů UNION, pokud není nic zadáno.
Kombinování tabulek pomocí funkce ALL
Nyní vytvořme sjednocovací dotaz (UNION), který obě tabulky sloučí pomocí funkce ALL.
SELECT `column1`, `column2` FROM `table1` UNION ALL SELECT `column1`, `column2` FROM `table2`;
Zde jsou zahrnuty duplicitní řádky, protože používáme ALL.
Dva obrázky rozdíl snadno ukazují a tabulka níže ho shrnuje.
| Bod srovnání | UNION VÝZNAM | UNION ALL |
|---|---|---|
| Duplicitní řádky | Odebráno z výsledku | Zachováno ve výsledku |
| Výchozí chování | Ano, použije se, pokud není nic specifikováno | Ne, klíčové slovo ALL musí být napsáno |
| Rychlost | Pomalejší, je vyžadován deduplikační průchod | Rychlejší, řádky se vracejí hned po načtení |
| Nejlépe se používá, když | Sloučený seznam musí obsahovat jedinečné řádky. | Každý řádek je důležitý, jinak se nemohou vyskytovat duplikáty |
💡 Tip: Pokud obě větve nemohou vytvořit duplicitní řádky, zvolte UNION ALL. Databáze pak přeskočí třídění a porovnávání, které vyžaduje DISTINCT, což představuje znatelnou úsporu u velkých tabulek.
Praktický příklad použití MySQL Workbench
Dosavadní příklady používaly vzorové tabulky. Stejný dotaz nyní běží na skutečné databázi myflixdb, kde obě tabulky obsahují zcela odlišné záznamy.
V naší databázi myFlixDB zkombinujme membership_number a full_names sloupce z tabulky členů s movie_id a title sloupce z tabulky filmů. Oba dotazy vracejí dva sloupce, takže sjednocení je platné.
Můžeme použít následující dotaz.
SELECT `membership_number`, `full_names` FROM `members` UNION SELECT `movie_id`, `title` FROM `movies`;
Spuštění výše uvedeného skriptu v MySQL ponk Prostřednictvím databáze myflixdb získáme následující výsledky. Všimněte si, že nadpisy pocházejí z prvního SELECTU, i když spodní řádky obsahují záznamy o filmech.
| membership_number | full_names |
|---|---|
| 1 | Janet Jones |
| 2 | Janet Smith Jones |
| 3 | Robert Phil |
| 4 | Gloria Williams |
| 5 | Leonard Hofstadter |
| 6 | Sheldon Cooper |
| 7 | Rajesh Koothrappali |
| 8 | Leslie Winkle |
| 9 | Howard Wolowitz |
| 16 | 67% Guilty |
| 6 | Angels and Demons |
| 4 | Code Name Black |
| 5 | Daddy's Little Girls |
| 7 | Davinci Code |
| 2 | Forgetting Sarah Marshal |
| 9 | Honey mooners |
| 19 | movie 3 |
| 1 | Pirates of the Caribean 4 |
| 18 | sample movie |
| 17 | The Great Dictator |
| 3 | X-Men |





