Menu
Coddy logo textTech

Объединение

Часть раздела Основы путешествия по SQL на Coddy — урок 48 из 72.

Unions отличаются от joins. Joins используют условия для объединения таблиц, в то время как unions просто добавляют одну таблицу поверх другой. Для использования UNION мы напишем:

SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2

Оба оператора SELECT должны подчиняться следующим правилам:

  • Количество полей должно быть одинаковым
  • Порядок имеет значение
  • Столбцы, находящиеся на одних и тех же позициях, должны иметь совпадающие типы данных

Например, предположим, что у нас есть следующие таблицы:

germany_people

idимя
1Лена
2Леони

england_people

idимя
1Джордж
2Лена

Задача: Мы хотим составить одну большую таблицу из всех имен, которые у нас есть.

SELECT name from germany_people
UNION
SELECT name from england_people

Результат:

имя
Лена
Леони
Джордж

UNION возвращает только уникальные значения, в то время как UNION ALL возвращает все записи как есть:

SELECT name from germany_people
UNION ALL
SELECT name from england_people

Результат:

имя
Lena
Leonie
George
Lena

Вы также можете комбинировать UNION ALL с агрегатными функциями, GROUP BY и ORDER BY, чтобы обобщить данные из нескольких таблиц. Хитрость заключается в том, чтобы обернуть UNION ALL в подзапрос, а затем применить группировку и сортировку поверх него.

Например, предположим, что мы хотим подсчитать, сколько раз каждое имя встречается в обеих таблицах:

SELECT name, COUNT(*) AS total_count
FROM (
    SELECT name FROM germany_people
    UNION ALL
    SELECT name FROM england_people
) AS combined
GROUP BY name
ORDER BY total_count DESC

Результат:

nametotal_count
Lena2
Leonie1
George1

Здесь UNION ALL (не UNION) используется для того, чтобы дубликаты, такие как Lena, сохранялись — иначе они были бы удалены перед подсчетом. Подзапрос объединяет все строки, а затем GROUP BY + COUNT суммируют их. ORDER BY сортирует окончательный результат.

challenge icon

Задание

Легко

Доступные таблицы и столбцы:

  • <strong>sales_2009</strong>: <strong>product_id</strong>, <strong>quantity_sold</strong>
  • <strong>sales_2010</strong>: <strong>product_id</strong>, <strong>quantity_sold</strong>
  • <strong>sales_2011</strong>: <strong>product_id</strong>, <strong>quantity_sold</strong>

Имеется 3 таблицы продаж.

Найдите сумму продаж для каждого продукта по всем таблицам вместе.

Результат должен включать product_id и общий объем продаж.

Назовите этот столбец total_sales.

Отсортируйте результаты по общему объему продаж в порядке убывания.

Шпаргалка

UNION объединяет таблицы, накладывая их друг на друга по вертикали. В отличие от соединений (joins), объединения не используют условия — они просто добавляют таблицы одну под другую.

Базовый синтаксис UNION:

SELECT col1, col2, ... FROM table1
UNION
SELECT col1, col2, ... FROM table2

Правила UNION:

  • Количество полей должно быть одинаковым
  • Порядок имеет значение
  • Столбцы на одних и тех же позициях должны иметь совпадающие типы данных

UNION против UNION ALL:

  • UNION возвращает только уникальные значения
  • UNION ALL возвращает все записи, включая дубликаты
SELECT name FROM germany_people
UNION
SELECT name FROM england_people
SELECT name FROM germany_people
UNION ALL
SELECT name FROM england_people

Вы можете использовать UNION ALL внутри подзапроса, а затем применить GROUP BY, ORDER BY и агрегатные функции к объединенному результату:

SELECT name, COUNT(*) AS total
FROM (
  SELECT name FROM germany_people
  UNION ALL
  SELECT name FROM england_people
) AS all_people
GROUP BY name
ORDER BY total DESC

Это подсчитывает, сколько раз каждое имя встречается в обеих таблицах, включая дубликаты.

Попробуйте сами

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы