Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
41
Добавлен:
17.04.2018
Размер:
329.22 Кб
Скачать

4. Дополнительные средства языка sql субд Oracle

4.1. Операторы объединения

Помимо традиционного соединения таблиц, используемого в многотабличных запросах, существует ряд альтернативных типов объединений. Они применяются в разных ситуациях — например, когда нужно комбинировать содержимое многих таблиц, имеющих похожие структуры, или сравнивать записи из разных таблиц, чтобы узнать, какие записи присутствуют в обеих таблицах или только в одной из них.

Все это можно делать с помощью операторов объединения (joining operators), связывая ими два оператора SELECT. Существует четыре различных оператора объединения, описанных в табл. 4.1. На рис. 4.1 графически показано, что получается в результате их применения.

Чтобы увидеть работу операторов объединения на примерах, имеющих практическое значение, следует создать новую таблицу и ввести в нее несколько записей, используя приведенные ниже команды.

Таблица 4.1

Операторы объединения

Оператор объединения

Получаемые результаты

UNION

Все строки из обоих операторов SELECT; повторяющиеся значения удаляются

UNION ALL

Все строки из обоих операторов SELECT; повторяющиеся значения показываются

INTERSECT

Строки, которые возвращены и первым, и вторым оператором SELECT

MINUS

Строки, которые возвращены первым оператором SELECT, исключая те, которые возвращены вторым оператором

Рис. 4.1. Результаты операций объединения

CREATE TABLE purchase_archive (

product_name VARCHAR2 (25) ,

salesperson VARCHAR2(3),

purchase_date DATE,

quantity NUMBER (4, 2)

) ;

INSERT INTO purchase_archive VALUES

('Round Snaphoo', 'BB', ' 21-JUN-06' , 10);

INSERT INTO purchase_archive VALUES

('Large Harflinger ', 'GA', '22-JUN-06', 50);

INSERT INTO purchase_archive VALUES

( 'Medium Wodget', 'LB', '23-JUN-06', 20);

INSERT INTO purchase_archive VALUES

('Small Widget' , 'ZZ', '24-JUN-07 '-, 80);

INSERT INTO purchase_archive VALUES

('Chrome Phoobar', 'CA', '25-JUN-07', 2) ;

INSERT INTO purchase_archive VALUES

('Small Widget', 'JT', '26-JUN-07', 50);

UNION

Оператор UNION предназначен для объединения данных из многих таблиц в один список. В отличие от операции соединения, предусмотренной в реляционной алгебре и использовавшейся ранее, этот оператор применяется в ситуациях, когда структуры двух таблиц похожи или идентичны, но их содержимое различается. Пример использования оператора UNION приведен ниже после двух операторов SELECT, выбирающих названия товаров из двух разных таблиц:

SELECT product_name FROM purchase

ORDER BY product_name;

SELECT product_name FROM purchase_archive

ORDER BY product_name;

SELECT product_name FROM purchase

UNION

SELECT product_name FROM purchase_archive

ORDER BY product_name;

Каждая из таблиц содержит некоторые товары, отсутствующие в другой таблице. Список, выведенный оператором UNION, содержит товары, присутствующие одновременно в двух таблицах.

UNION ALL

Оператор объединения UNION ALL функционально похож на оператор UNION, но он возвращает все возможные строки, а не только по одной строке для каждого уникального значения. Увидеть, в чем состоит отличие, можно с помощью следующей команды:

SELECT product_name FROM purchase

UNION ALL

SELECT product_name FROM purchase_archive

ORDER BY product_name;

Этот оператор полезен, когда требуется подсчитать количество экземпляров каждого товара в обеих таблицах.

INTERSECT

Оператор объединения INTERSECT возвращает только те значения, которые присутствуют в обеих таблицах, и задает операцию пересечения, предусмотренную в реляционной алгебре. Если значение найдено лишь в одной таблице, оно игнорируется. Это очень удобно, когда нужно найти значения, общие для пары таблиц:

SELECT product_name FROM purchase

INTERSECT

SELECT product_name FROM purchase_archive

ORDER BY product_name;

MINUS

Оператор объединения MINUS и задает операцию вычитания, предусмотренную в реляционной алгебре. Он противоположен оператору INTERSECT и показывает записи, присутствующие только в первой из двух таблиц. Такая возможность полезна, когда нужно выяснить, какие компоненты не используются и могут быть заархивированы, или определить, какие значения из одной таблицы не представлены в другой:

SELECT product_name FROM purchase

MINUS

SELECT product_name FROM purchase_archive

ORDER BY product_name;

Соседние файлы в папке лекции оракл