
- •4. Дополнительные средства языка sql субд Oracle
- •4.1. Операторы объединения
- •4.2. Подзапросы (вложенные запросы)
- •Однострочные подзапросы
- •Многострочные подзапросы
- •Подзапросы, возвращающие более одного столбца
- •4.3. Перенос данных между таблицами
- •Перенос данных с помощью оператора insert
- •Создание новой таблицы на основе уже существующей
- •4.4. Переименование таблиц
- •4.6. Представления
- •Создание представления
- •Удаление представлений
- •Изменение определения представления
- •Анализ первых n записей
- •4.7. Другие объекты базы данных Последовательности
- •Синонимы
- •Словарь данных Oracle
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;