MySQL UNION – повний підручник
⚡ Розумний підсумок
MySQL UNION об'єднує результати двох або більше запитів SELECT в один об'єднаний набір результатів. Це пояснення охоплює правила стовпців, які роблять об'єднання коректним, різницю між UNION DISTINCT та UNION ALL, а також робочі приклади, виконані в базі даних myflixdb.

Що таке СПІЛКА в MySQL?
СОЮЗ це MySQL оператор, який об'єднує результати кількох запитів SELECT у консолідований набір результатів. Рядки, повернуті другим запитом, розміщуються під рядками, повернутими першим, що створює один вертикальний список замість двох окремих.
Єдина вимога для того, щоб це спрацювало, полягає в тому, щоб кількість стовпців у всіх запитах SELECT, які потрібно об'єднати, була однаковою.
Припустимо, у нас є дві таблиці, як показано нижче.
Обидві таблиці містять два стовпці одного типу, тому їх можна об'єднати. Наведені нижче приклади поєднують саме ці дві таблиці.
Чому варто використовувати UNION?
Припустимо, що у вашій базі даних є недолік, і ви використовуєте дві різні таблиці, призначені для однієї й тієї ж мети. Ви хочете об'єднати ці дві таблиці в одну, виключивши будь-які дублікати записів з cree.ping у нову таблицю. У таких випадках можна використовувати UNION.
Оператор також корисний у повсякденній звітній роботі:
- Archiведені та актуальні дані: Поточну таблицю та архівну таблицю, які мають однакові стовпці, можна звітувати разом, без їх фізичного об'єднання.
- Кілька джерел, один звіт: Учасники та фільми, або продажі з двох регіонів, можуть бути перелічені в одному виводі для швидкого аудиту.
- Перевірки міграції: Рядки зі старої та нової таблиць можна об'єднати в стоси та порівняти, перш ніж стару таблицю буде видалено.
Об'єднання не замінює JOIN. UNION додає рядки під рядки, тоді як JOIN додає стовпці поруч із стовпцями, і ця відмінність визначає, який оператор викликає завдання.
MySQL Синтаксис та правила UNION
Тепер, коли мета зрозуміла, розглянемо форму оператора та правила, які застосовує база даних.
SELECT column1, column2 FROM `table1` UNION [DISTINCT | ALL] SELECT column1, column2 FROM `table2`;
Три правила регулюють кожен союз:
- Рівна кількість стовпців. Кожен Оператор SELECT має повертати таку ж кількість стовпців, інакше MySQL викликає помилку 1222.
- Сумісні типи даних у тому ж порядку. Перший стовпець першого запиту зіставляється зі стовпцем одним другого, тому число має відповідати числу, а текст має відповідати тексту.
- Імена походять з першого запиту. Заголовок результуючого набору береться з першого запиту SELECT, тому будь-який псевдонім має там бути.
An ORDER BY або LIMIT Речення, розміщене в кінці, застосовується до об'єднаного результату, а не до однієї його гілки, і воно має посилатися на імена стовпців, отримані першим оператором SELECT.
UNION DISTINCT проти UNION ALL
З урахуванням правил залишається питання, чи повинні дублікати рядків вижити.
Об'єднання таблиць за допомогою DISTINCT
Тепер створимо запит UNION для об'єднання обох таблиць за допомогою DISTINCT.
SELECT column1, column2 FROM `table1` UNION DISTINCT SELECT column1, column2 FROM `table2`;
Тут повторювані рядки видаляються, і повертаються лише унікальні рядки.
Примітка: MySQL використовує речення DISTINCT як типове під час виконання запитів UNION, якщо нічого не вказано.
Об'єднання таблиць за допомогою ALL
Тепер створимо запит UNION для об'єднання обох таблиць за допомогою оператора ALL.
SELECT `column1`, `column2` FROM `table1` UNION ALL SELECT `column1`, `column2` FROM `table2`;
Тут включено дублікати рядків, оскільки ми використовуємо ALL.
На двох зображеннях різницю легко побачити, а таблиця нижче її підсумовує.
| Точка порівняння | СОЮЗ ДИСТИНКТ | UNION ALL |
|---|---|---|
| Дублікати рядків | Видалено з результату | Збережено в результаті |
| Поведінка за замовчуванням | Так, застосовується, коли нічого не вказано | Ні, ключове слово ALL має бути написано |
| швидкість | Повільніше, потрібен прохід для дедуплікації | Швидше, рядки повертаються під час їх зчитування |
| Найкраще використовувати, коли | Об'єднаний список має містити унікальні рядки | Кожен рядок важливий, інакше дублікати не можуть виникати |
💡 Порада: Якщо дві гілки не можуть створити дублікати рядків, виберіть UNION ALL. База даних тоді пропускає роботу сортування та порівняння, яку вимагає DISTINCT, що є помітною економією на великих таблицях.
Практичний приклад використання MySQL Верстак
У попередніх прикладах використовувалися зразки таблиць. Той самий запит тепер виконується до реальної бази даних myflixdb, де дві таблиці містять зовсім різні записи.
У нашій myFlixDB давайте об'єднаємо membership_number та full_names стовпці з таблиці учасників за допомогою movie_id та title стовпці з таблиці фільмів. Обидва запити повертають два стовпці, тому об'єднання є коректним.
Ми можемо використати наступний запит.
SELECT `membership_number`, `full_names` FROM `members` UNION SELECT `movie_id`, `title` FROM `movies`;
Виконання наведеного вище сценарію в MySQL верстак Аналіз myflixdb дає нам такі результати, як показано нижче. Зверніть увагу, що заголовки взяті з першого SELECT, хоча нижні рядки є записами фільмів.
| 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 |




