← Все вопросы

Как объединить результаты двух запросов в SQL (UNION)?

Задан 11 месяцев назад392 просмотров2 ответа
8

У меня есть таблица текущих клиентов и таблица архивных. Хочу получить один общий список имён из обеих. Как объединить результаты двух SELECT в SQL? Чем UNION отличается от UNION ALL?

2 ответа

13
✓ Принятый ответ — помог автору

Склеить результаты двух запросов «друг под друга» (по строкам) помогает оператор UNION:

SELECT name, email FROM customers
UNION
SELECT name, email FROM archived_customers;

Главное различие:

  • UNION — объединяет и удаляет дубликаты (одинаковые строки останутся в одном экземпляре).
  • UNION ALL — объединяет со всеми повторами, ничего не убирает, и поэтому работает быстрее (не тратит время на поиск дублей).

Если дубликаты невозможны или не мешают — берите UNION ALL, он эффективнее.

Жёсткие требования к запросам в UNION:

  1. Одинаковое число столбцов в каждом SELECT.
  2. Совместимые типы столбцов по позициям (текст к тексту, число к числу).
  3. Имена колонок берутся из первого запроса — алиасы во втором игнорируются.

ORDER BY пишется один раз в самом конце и сортирует уже объединённый результат:

SELECT name FROM customers
UNION ALL
SELECT name FROM archived_customers
ORDER BY name;

Частая путаница: UNION объединяет по вертикали (добавляет строки), а JOIN — по горизонтали (добавляет столбцы). Если вам нужно подтянуть данные из связанной таблицы в те же строки — это JOIN, а не UNION.

4

Маленькое, но частое предостережение: не пытайтесь объединять UNION-ом запросы с разным числом или смыслом столбцов, «лишь бы влезло». Если в первом 2 столбца, а во втором 3 — будет ошибка. А если число совпало, но смысл разный (в одном email, в другом телефон в той же позиции) — ошибки не будет, но получится бессмыслица. Следите, чтобы колонки по позициям были однотипными по сути.

Ваш ответ

, чтобы ответить на вопрос.