Селект данных из двух несвязанных таблиц SQL: подробный способ
Быстрый ответ
Для объединения результатов двух запросов SELECT используйте оператор UNION, который применяется для объединения и удаления дублирующихся записей. Если же требуется сохранить все записи, включая повторяющиеся, примените UNION ALL. Оператор JOIN также может быть использован для обращения к данным из различных таблиц в рамках одного запроса.
Пример с UNION:
SELECT name FROM customers
UNION
SELECT email FROM subscribers; -- Объединяем имена клиентов и email'ы подписчиков
Пример с JOIN:
SELECT customers.name, orders.amount
FROM customers
INNER JOIN orders ON customers.id = orders.customer_id; -- Связываем клиентов с их заказами
При использовании UNION, типы данных и количество столбцов в запросах должны быть одинаковыми. Сортировка результатов осуществляется с помощью оператора ORDER BY, а фильтрация данных – через предикат WHERE.
Добавление к UNION фильтров и сортировок
Отбор необходимых данных
Как отобрать нужные данные из множества других, наподобие выбора блюд из разнообразного меню ресторана? В этом поможет оператор UNION:
SELECT 'Customer' as Type, name, created_at FROM customers
WHERE created_at > '2020-01-01'
UNION
SELECT 'Subscriber' as Type, name, sign_up_date FROM subscribers
WHERE sign_up_date > '2020-01-01'
ORDER BY created_at; -- Результаты отсортированы по дате создания
Отношение к дубликатам
Если вы хотите сохранить дубликаты, примените UNION ALL:
SELECT 'Blog' AS Source, title FROM blog_posts
UNION ALL
SELECT 'News' AS Source, headline FROM news_articles; -- Иногда важно сохранить дублирующиеся данные
Визуализация
В SQL объединение двух запросов SELECT можно представить как соединение двух разных меню:
Меню 1 (🍲): [Салат 🥗, Суп 🥣, Бургер 🍔]
Меню 2 (🍝): [Пицца 🍕, Паста 🍝, Стейк 🥩]
Выбор пищи похож на запросы SELECT:
SELECT 'Salad 🥗' FROM Menu 1
UNION
SELECT 'Pizza 🍕' FROM Menu 2;
В итоге, объединив два меню, мы получаем: 🍽️ [Салат 🥗, Пицца 🍕]
Создание сложных запросов
Использование подзапросов с UNION может быть полезно для вывода определенных показателей:
SELECT author, (SELECT COUNT(*) FROM books b WHERE b.author_id = a.id) as book_count
FROM authors a
UNION
SELECT editor, (SELECT COUNT(*) FROM articles c WHERE c.editor_id = e.id) as article_count
FROM editors e; -- Объединяем данные по количеству книг у каждого автора и статей с каждым редактором
Полезные материалы
- MySQL :: Справочное руководство по MySQL 8.0 :: 15.2.18 UNION — подробное описание использования UNION в среде MySQL.
- PostgreSQL: Документация: 9.26: Общие табличные выражения (WITH) — примеры использования Common Table Expressions (WITH) в PostgreSQL.
- SQL – Joins — обзор различных типов оператора JOIN в SQL.
- CASE (Transact-SQL) – SQL Server | Microsoft Docs — информация об операторах CASE в Transact-SQL.
- MySQL offset infinite rows – Stack Overflow — также обсуждение использования нескольких запросов SELECT в одном на Stack Overflow.