MySQL UNION – повний підручник

⚡ Розумний підсумок

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

  • 🔗 Основна мета: UNION об'єднує рядки, повернуті кількома запитами SELECT, в один набір результатів, один запит під іншим.
  • 📐 Правило стовпця: Кожен SELECT має повертати однакову кількість стовпців, у однаковому порядку, із сумісними типами даних.
  • 🧹 ВІДДІЛЮЮЧИЙ СОЮЗ: Дублікати рядків видаляються, і повертаються лише унікальні рядки, і це поведінка MySQL застосовується за замовчуванням.
  • 📚 ВСІ ОБ'ЄДНАННЯ: Повертається кожен рядок, включаючи дублікати, що швидше, оскільки не потрібен прохід для видалення дублікатів.
  • 🏷️ Назви стовпців: Набір результатів бере назви стовпців з першого оператора SELECT, тому псевдоніми належать до цього запиту.
  • 🛠️ Типове використання: Об'єднання двох таблиць, що містять записи одного типу, без допущення дублікатів рядків у об'єднаному виводі.

MySQL СОЮЗ Operaтор

Що таке СПІЛКА в MySQL?

СОЮЗ це MySQL оператор, який об'єднує результати кількох запитів SELECT у консолідований набір результатів. Рядки, повернуті другим запитом, розміщуються під рядками, повернутими першим, що створює один вертикальний список замість двох окремих.

Єдина вимога для того, щоб це спрацювало, полягає в тому, щоб кількість стовпців у всіх запитах SELECT, які потрібно об'єднати, була однаковою.

Припустимо, у нас є дві таблиці, як показано нижче.

MySQL СОЮЗMySQL СОЮЗ

Обидві таблиці містять два стовпці одного типу, тому їх можна об'єднати. Наведені нижче приклади поєднують саме ці дві таблиці.

Чому варто використовувати UNION?

Припустимо, що у вашій базі даних є недолік, і ви використовуєте дві різні таблиці, призначені для однієї й тієї ж мети. Ви хочете об'єднати ці дві таблиці в одну, виключивши будь-які дублікати записів з cree.ping у нову таблицю. У таких випадках можна використовувати UNION.

Оператор також корисний у повсякденній звітній роботі:

  • Archiведені та актуальні дані: Поточну таблицю та архівну таблицю, які мають однакові стовпці, можна звітувати разом, без їх фізичного об'єднання.
  • Кілька джерел, один звіт: Учасники та фільми, або продажі з двох регіонів, можуть бути перелічені в одному виводі для швидкого аудиту.
  • Перевірки міграції: Рядки зі старої та нової таблиць можна об'єднати в стоси та порівняти, перш ніж стару таблицю буде видалено.

Об'єднання не замінює JOIN. UNION додає рядки під рядки, тоді як JOIN додає стовпці поруч із стовпцями, і ця відмінність визначає, який оператор викликає завдання.

MySQL Синтаксис та правила UNION

Тепер, коли мета зрозуміла, розглянемо форму оператора та правила, які застосовує база даних.

SELECT column1, column2 FROM `table1`
UNION [DISTINCT | ALL]
SELECT column1, column2 FROM `table2`;

Три правила регулюють кожен союз:

  1. Рівна кількість стовпців. Кожен Оператор SELECT має повертати таку ж кількість стовпців, інакше MySQL викликає помилку 1222.
  2. Сумісні типи даних у тому ж порядку. Перший стовпець першого запиту зіставляється зі стовпцем одним другого, тому число має відповідати числу, а текст має відповідати тексту.
  3. Імена походять з першого запиту. Заголовок результуючого набору береться з першого запиту 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

Поширені запитання

UNION розміщує рядки одного запиту під іншим, тому результат стає вищим. РЕЄСТРАЦІЯ Зіставляє пов'язані рядки та розміщує їхні стовпці поруч, щоб результат ставав ширшим. Використовуйте UNION для подібних рядків та JOIN для пов'язаних таблиць.

Розмістіть сингл СОРТУВАТИ ЗА речення після останнього оператора SELECT. Воно сортує об'єднаний результат і має використовувати імена стовпців, отримані першим оператором SELECT. Речення LIMIT, розміщене там, поводиться так само.

Помилка 1222 з'являється, коли гілки SELECT повертають нерівну кількість стовпців. Порахуйте стовпці в кожній гілці та додайте літерал або заповнювач NULL до коротшої гілки, щоб обидві сторони вишикувалися в одному порядку.

Так. Помічники з тексту для SQL, включаючи вбудовані в MySQL Верстак, генеруйте оператори UNION зі звичайного запиту. Перевірте порядок стовпців самостійно, оскільки модель може вирівнювати стовпці, які просто виглядають схожими.

Асистент може запропонувати UNION ALL, коли дублікати неможливі, що є поширеним способом скорочення. Рішення все ще залежить від даних, тому переконайтеся, що гілки дійсно не можуть перетинатися, перш ніж видаляти крок дедуплікації.

Підсумуйте цей пост за допомогою: