Объединение выборок 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.

Вот и всё.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.