Объединение выборок UNION, INTERSECT, MINUS в Oracle (PL/SQL)
В Oracle присутствует возможность объединять выборки. Для объединения используются операторы: UNION (с вариацией UNION ALL), INTERSECT и MINUS. Рассмотрим работу всех этих операторов.
1. UNION и UNION ALL
UNION — объединяет наборы данных, но при этом исключает дублирующие записи, тоесть если у вас в первом и во втором наборе есть одинаковая запись то в результирующем наборе будет только одна такая запись.
UNION ALL — объединяет наборы данных и оставляет дублирующие записи, тоесть если в первом и во втором наборе есть одинаковые записи то в результирующем наборе будут все эти записи.
Для экспериментов, создадим две таблицы и заполним их тестовыми данными.
--Создаем первую таблицу
create table PERSONS
(
id NUMBER,
name VARCHAR2(50)
);
--Создаем вторую таблицу
create table PERSONS1
(
id NUMBER,
name VARCHAR2(50)
);
Заполняем таблицы данными
begin
insert into persons (id, name) values (1, 'Роман');
insert into persons (id, name) values (2, 'Петр');
insert into persons (id, name) values (3, 'Евгений');
insert into persons (id, name) values (4, 'Сергей');
insert into persons (id, name) values (5, 'Григорий');
insert into persons1 (id, name) values (1, 'Роман');
insert into persons1 (id, name) values (2, 'Петр');
insert into persons1 (id, name) values (3, 'Евгений');
insert into persons1 (id, name) values (4, 'Светлана');
insert into persons1 (id, name) values (5, 'Ирина');
insert into persons1 (id, name) values (6, 'Елизавета');
end;
Теперь посмотрим как работает UNION
Запрос
select * from persons
union
select * from persons1;
Результат
ID NAME
---------- --------------------------------------------------
1 Роман
2 Петр
3 Евгений
4 Светлана
4 Сергей
5 Григорий
5 Ирина
6 Елизавета
В результате мы видим что Роман Петр и Евгений — встречаются только один раз, хотя идентичные записи есть и в таблице persons и в таблице persons1.
Теперь посмотрим как работает UNION ALL
Запрос
select * from persons
union all
select * from persons1;
Результат
ID NAME
---------- --------------------------------------------------
1 Роман
2 Петр
3 Евгений
4 Сергей
5 Григорий
1 Роман
2 Петр
3 Евгений
4 Светлана
5 Ирина
6 Елизавета
В результате мы видим что выбраны все записи из двух таблиц, при этом одинаковые записи не объединены а продублированы.
2. INTERSECT
INTERSECT — Объединяет наборы и возвращает только те записи которые присутствуют и в первом и во втором наборе.
Посмотрим как работает INTERSECT
Запрос
select * from persons
intersect
select * from persons1;
Результат
ID NAME
---------- --------------------------------------------------
1 Роман
2 Петр
3 Евгений
В результате мы видим что нам вернулись только те записи которые присутствуют и идентичны и в таблице persons и в таблице persons1.
3. MINUS
MINUS — Исключает из первого набора те записи которые присутствуют и во втором наборе
Посмотрим как работает оператор MINUS
Запрос
select * from persons
minus
select * from persons1;
Результат
ID NAME
---------- --------------------------------------------------
4 Сергей
5 Григорий
Мы видим, что а результирующем наборе присутствуют только те записи которых нет в таблице persons1 но есть в таблице persons.
Теперь поменяем таблицы местами
Запрос
select * from persons1
minus
select * from persons;
Результат
ID NAME
---------- --------------------------------------------------
4 Светлана
5 Ирина
6 Елизавета
И теперь мы видим что в результате присутствуют только те записи которые есть в таблице persons1 но которых нет в таблице persons.
Вот и всё.