SQL
January 11

Операторы множеств - 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