Операторы множеств - UNION, EXCEPT (MINUS) и INTERSECT
UNION - Объединение множеств строк
UNION ALL
Оператор UNION ALL в SQL используется для объединения результатов двух или более запросов в один результат. Он возвращает все строки из всех запросов, включая повторяющиеся строки.
Допустим, есть 2 таблицы: album
и album_archive
. Раньше делали соединение таблиц, чтобы найти совпадающие строки. Еще можно склеить 2 таблицы в единую таблицу, чтобы были строки из обеих таблиц.
SELECT * FROM album_small
SELECT * FROM album_archive
А теперь объединим эти 2 таблицы с помощью UNION ALL
SELECT * FROM album_small UNION ALL SELECT * FROM album_archive
Первый и второй SELECT
могут иметь разные названия колонок, главное чтобы второй SELECT
возвращал такое же количество колонок и такие же типы данных, как и у колонок первого SELECT
. Основной будет первая таблица, и записи из второй таблицы попадут в соответствующие колонки первой таблицы.
Если в первой и второй таблице есть одинаковые строки - они будут повторяться при объединении UNION ALL
. То есть устранение дубликатов не происходит.
UNION
Если нужно устранить дубликаты - тогда используется UNION
.
SELECT * FROM album_small
SELECT * FROM album_archive
А теперь объединим эти 2 таблицы с помощью UNION ALL
SELECT * FROM album_small UNION SELECT * FROM album_archive
Если в конце дописать сортировку ORDER BY, тогда выполнится общая сортировка, а не сортировка только второй таблицы:
SELECT * FROM album_small UNION ALL SELECT * FROM album_archive ORDER BY name
Посчитаем количество строчек в разных таблицах с помощью UNION ALL
SELECT 'album' as table_name, COUNT(*) FROM album UNION ALL SELECT 'band' as table_name, COUNT(*) FROM band UNION ALL SELECT 'person' as table_name, COUNT(*) FROM person
EXCEPT (MINUS) - Вычитание множеств строк
EXCEPT ALL
Это вычитание одного множества строк из другого. Он находит строки из первого запроса и вычитает из них строки второго запроса, выводя только остаток первой таблицы.
SELECT * FROM album_small
SELECT * FROM album_archive
А теперь вычитаем из первой таблицы вторую таблицу. В результате исчезнет альбом QUEEN II.
SELECT * FROM album_small EXCEPT ALL SELECT * FROM album_archive
Допустим, есть 3 дубликата строк в первой таблице. Если проделать ту же операцию, что и выше - тогда получим в результате 2 строки т.к. вторая таблица вычтет только одну строку.
Оператор EXCEPT удаляет все дубликаты:
SELECT * FROM album_small EXCEPT ALL SELECT * FROM album_archive
INTERSECT - Пересечение множеств строк
INTERSECT ALL
INTERSECT ALL - возвращает только строки, которые присутствуют в результатах обоих SELECT.
SELECT * FROM album_small
SELECT * FROM album_archive
SELECT * FROM album_small INTERSECT ALL SELECT * FROM album_archive
Как INTERSECT ALL реагирует на дубликаты
То есть INTERSECT ALL возвращает 2 результата, игнорируя дубликаты.
INTERSECT
SELECT * FROM album_small INTERSECT SELECT * FROM album_archive
INTERSECT устраняет дубликаты и возвращает только одну строку с QUEEN II