Menu
Coddy logo textTech

Объединение

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

Объединения отличаются от соединений. Соединения используют условия для объединения таблиц, а объединения просто добавляют одну таблицу поверх другой. Чтобы использовать UNION, мы напишем:

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

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

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

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

germany_people

idname
1Lena
2Leonie

england_people

idname
1George
2Lena

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

SELECT name from germany_people
UNION
SELECT name from england_people

Результат:

name
Lena
Leonie
George

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

SELECT name from germany_people
UNION ALL
SELECT name from england_people

Результат:

name
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.

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

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

-- Сложить три таблицы в один результат, сохраняя каждую строку
SELECT product_id, ____ AS total_sales
FROM (
    SELECT * FROM sales_2009
    ____
    SELECT * FROM sales_2010
    ____
    SELECT * FROM sales_2011
)
-- Одна строка на продукт, наибольший итог первым
GROUP BY ____
ORDER BY ____ DESC;
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Песочница SQL