Объединение
Часть раздела Основы путешествия по 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Результат:
| name | total_count |
| Lena | 2 |
| Leonie | 1 |
| George | 1 |
Здесь UNION ALL (не UNION) используется для того, чтобы дубликаты, такие как Lena, сохранялись — иначе они были бы удалены перед подсчетом. Подзапрос объединяет все строки, а затем GROUP BY + COUNT суммируют их. ORDER BY сортирует окончательный результат.
Задание
ЛегкоДоступные таблицы и столбцы:
<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_peopleSELECT 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Это подсчитывает, сколько раз каждое имя встречается в обеих таблицах, включая дубликаты.
Попробуйте сами
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
4Больше ключевых слов
Ключевое слово INКлючевое слово BETWEENКлючевое слово LIKEКлючевое слово ASПовторение - Модели мобильных телефонов2Условия
Основы условийКлючевое слово ANDКлючевое слово ORКлючевое слово NOTКомбинирование нескольких условийСкобкиБулевы значения5Арифметические операции
Математические операторыМатематические столбцыОперация moduloФункция ROUND()3Специальный формат возврата
Значения NULLСортировка результатов, часть 1Сортировка результатов, часть 2Повторение - Фирма по кибербезопасностиОграничение количества записейПовторение - Автозавод6Вводные вызовы
Повторение - Парламентские выборыПовторение - Арест преступника полициейПовторение - Ёмкость для напитков в бареПовторение - Создание новых столбцов