Объединение результатов: UNION
Соединение ставит таблицы рядом: столбцы одной рядом со столбцами другой. UNION ставит результаты двух запросов друг под другом: сначала строки первого запроса, потом строки второго. Что нового в магазине с августа 2025 года: новые клиенты и новые игры в одном списке:
SELECT joined AS day, 'new customer' AS event, name AS detail
FROM customers
WHERE joined >= '2025-08-01'
UNION ALL
SELECT released, 'new game', title
FROM games
WHERE released >= '2025-08-01'
ORDER BY day;| day | event | detail |
|---|---|---|
| 2025-08-21 | new customer | Sophie Adams |
| 2025-09-26 | new game | Goal Rush |
| 2025-10-03 | new customer | Max Baker |
| 2025-11-14 | new game | Knight's Oath |
Оба запроса должны иметь одинаковое число столбцов. Столбцы сопоставляются по позиции, а не по именам: первый столбец второго запроса попадает под первый столбец первого запроса, и так далее. Имена столбцов берутся из первого запроса, поэтому псевдонимы нужны только в нём. Если число столбцов разное, получится ошибка:
Error on line 1: SELECTs to the left and right of UNION do not have the same number of result columnsОбратите внимание на столбцы 'new customer' и 'new game': текст в кавычках даёт одно и то же значение в каждой строке, и здесь он показывает, откуда взялась каждая строка.
UNION ALL сохраняет все строки. UNION без ALL удаляет из результата повторяющиеся строки, как это делает DISTINCT. Игры, которые кто-то заказывал или о которых писал отзыв, SELECT game_id FROM order_items UNION SELECT game_id FROM reviews, дают 17 строк, каждая игра по разу. С UNION ALL получится 67 строк: по одной на каждую позицию каждого заказа и по одной на каждый отзыв. Когда вы знаете, что повторов быть не может, или хотите их сохранить, используйте UNION ALL: базе данных не нужно искать повторы, поэтому он быстрее.
ORDER BY пишется только один раз, в самом конце, и сортирует весь результат; то же относится к LIMIT. Он использует имена столбцов первого запроса, здесь — day. ORDER BY после первого запроса заканчивается ошибкой ORDER BY clause should come after UNION not before.
Типичная ошибка: столбцы в другом порядке. Если бы во втором запросе было SELECT title, 'new game', released, SQLite не стал бы возражать: он молча поставил бы названия под датами. Проверяйте, что столбцы обоих запросов означают одно и то же.
Задание
- 1
Покажите, сколько игр в каждом жанре, как
genreиgame_count, и добавьте ещё одну строку: текстAll genresи число всех игр. Отсортируйте поgame_countпо убыванию, затем по жанру:genre game_count All genres 20 Action 4 Adventure 3 Strategy 3 … … - 2
Ниже покажите имена клиентов, которым менеджеру стоит позвонить: у кого был возвращённый заказ и кто написал отзыв меньше чем на 3 звезды. Каждый должен быть в списке только один раз. В первом запросе соедините
customersсorders, во втором —customersсreviews. Отсортируйте по имени:name Grace Hall Jack Harris Leo Walker