MySQL UNIA – Kompletny samouczek
⚡ Inteligentne podsumowanie
MySQL UNION łączy wyniki dwóch lub więcej zapytań SELECT w jeden skonsolidowany zestaw wyników. Niniejsze wyjaśnienie obejmuje reguły kolumnowe, które warunkują poprawność unii, różnicę między UNION DISTINCT a UNION ALL oraz przykłady uruchomień w bazie danych myflixdb.

Czym jest UNIA w MySQL?
UNION jest MySQL Operator łączący wyniki wielu zapytań SELECT w skonsolidowany zestaw wyników. Wiersze zwrócone przez drugie zapytanie są umieszczane pod wierszami zwróconymi przez pierwsze, co tworzy jedną listę pionową zamiast dwóch oddzielnych.
Jedynym wymogiem, aby to zadziałało, jest to, że liczba kolumn musi być taka sama we wszystkich zapytaniach SELECT, które mają zostać połączone.
Załóżmy, że mamy dwie tabele, jak poniżej.
Obie tabele zawierają dwie kolumny tego samego typu, więc kwalifikują się do połączenia. Poniższe przykłady łączą dokładnie te dwie tabele.
Dlaczego warto wybrać UNION?
Załóżmy, że w projekcie Twojej bazy danych występuje błąd i używasz dwóch różnych tabel przeznaczonych do tego samego celu. Chcesz skonsolidować te dwie tabele w jedną, pomijając jednocześnie wszelkie duplikaty rekordów w pliku cree.ping do nowej tabeli. W takich przypadkach można użyć UNION.
Operator jest również przydatny w codziennej pracy raportowej:
- Archidane rejestrowane i na żywo: Bieżącą tabelę i tabelę archiwalną, które współdzielą te same kolumny, można generować razem, bez konieczności ich fizycznego scalania.
- Kilka źródeł, jeden raport: Członków i filmy lub sprzedaż z dwóch regionów można wyświetlić w jednym wynikach, co umożliwia szybki audyt.
- Kontrole migracji: Wiersze ze starej tabeli i nowej tabeli można ułożyć w stos i porównać przed usunięciem starej tabeli.
Unia nie zastępuje połączenia JOIN. Połączenie UNION dodaje wiersze pod wierszami, natomiast połączenie JOIN dodaje kolumny obok kolumn, a to rozróżnienie decyduje, którego operatora wymaga zadanie.
MySQL Składnia i reguły UNION
Teraz, gdy cel jest jasny, przyjrzyjmy się kształtowi oświadczenia i regułom egzekwowanym przez bazę danych.
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
Każdy związek zawodowy kieruje się trzema zasadami:
- Taka sama liczba kolumn. Każdy SELECT oświadczenie musi zwrócić taką samą liczbę kolumn, w przeciwnym razie MySQL powoduje błąd 1222.
- Zgodne typy danych w tej samej kolejności. Pierwsza kolumna pierwszego zapytania jest dopasowywana do pierwszej kolumny drugiego zapytania, więc liczba powinna spotkać się z liczbą, a tekst powinien spotkać się z tekstem.
- Nazwy pochodzą z pierwszego zapytania. Nagłówek zestawu wyników pobierany jest z pierwszego polecenia SELECT, dlatego też wszelkie aliasy powinny tam się znajdować.
An ORDER BY lub LIMIT Klauzula umieszczona na końcu odnosi się do łącznego wyniku, a nie do jednej jego gałęzi, i musi odwoływać się do nazw kolumn wygenerowanych przez pierwszą instrukcję SELECT.
UNION DISTINCT vs UNION ALL
Po wprowadzeniu tych zasad pozostaje decyzja, czy powielone wiersze mają zostać zachowane.
Łączenie tabel za pomocą DISTINCT
Utwórzmy teraz zapytanie UNION łączące obie tabele za pomocą DISTINCT.
SELECT column1, column2 FROM `table1` UNION DISTINCT SELECT column1, column2 FROM `table2`;
Tutaj zduplikowane wiersze są usuwane i zwracane są tylko unikalne wiersze.
Uwaga: MySQL używa klauzuli DISTINCT jako domyślnej podczas wykonywania zapytań UNION, jeśli nic nie jest określone.
Łączenie tabel za pomocą ALL
Utwórzmy teraz zapytanie UNION łączące obie tabele za pomocą ALL.
SELECT `column1`, `column2` FROM `table1` UNION ALL SELECT `column1`, `column2` FROM `table2`;
Tutaj uwzględniane są powielone wiersze, ponieważ używamy opcji ALL.
Różnicę łatwo zauważyć na obu obrazkach, a poniższa tabela ją podsumowuje.
| Punkt porównania | ODRÓŻNIENIE UNII | UNIA WSZYSTKIE |
|---|---|---|
| Zduplikowane wiersze | Usunięto z wyniku | Utrzymany w wyniku |
| Domyślne zachowanie | Tak, stosowane, gdy nic nie jest określone | Nie, słowo kluczowe ALL musi być napisane |
| Prędkość | Wolniej, wymagany jest przebieg deduplikacji | Szybciej, wiersze są zwracane w miarę ich odczytywania |
| Najlepiej stosować, gdy | Połączona lista musi zawierać unikatowe wiersze | Każdy wiersz ma znaczenie, w przeciwnym razie nie mogą wystąpić duplikaty |
💡 Wskazówka: Jeśli obie gałęzie nie mogą wygenerować zduplikowanych wierszy, wybierz UNION ALL. Baza danych pomija wówczas sortowanie i porównywanie wymagane przez DISTINCT, co jest zauważalną oszczędnością w przypadku dużych tabel.
Praktyczny przykład użycia MySQL Workbench
W dotychczasowych przykładach wykorzystano przykładowe tabele. To samo zapytanie jest teraz uruchamiane w prawdziwej bazie danych myflixdb, gdzie obie tabele zawierają zupełnie różne rekordy.
W naszym myFlixDB połączmy membership_number oraz full_names kolumny z tabeli członków z movie_id oraz title kolumny z tabeli „filmy”. Oba zapytania zwracają dwie kolumny, więc unia jest prawidłowa.
Możemy użyć następującego zapytania.
SELECT `membership_number`, `full_names` FROM `members` UNION SELECT `movie_id`, `title` FROM `movies`;
Wykonanie powyższego skryptu w MySQL Workbench W przypadku bazy danych myflixdb otrzymujemy następujące wyniki. Zauważ, że nagłówki pochodzą z pierwszego polecenia SELECT, mimo że dolne wiersze zawierają rekordy filmowe.
| 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 |




