- •4. Дополнительные средства языка sql субд Oracle
- •4.1. Операторы объединения
- •4.2. Подзапросы (вложенные запросы)
- •Однострочные подзапросы
- •Многострочные подзапросы
- •Подзапросы, возвращающие более одного столбца
- •4.3. Перенос данных между таблицами
- •Перенос данных с помощью оператора insert
- •Создание новой таблицы на основе уже существующей
- •4.4. Переименование таблиц
- •4.6. Представления
- •Создание представления
- •Удаление представлений
- •Изменение определения представления
- •Анализ первых n записей
- •4.7. Другие объекты базы данных Последовательности
- •Синонимы
- •Словарь данных Oracle
Подзапросы, возвращающие более одного столбца
Все подзапросы, рассмотренные до сих пор, извлекали только один столбец данных. Однако они могут возвращать и несколько столбцов. Эту возможность демонстрирует приведенный ниже код, который анализирует названия товаров и даты покупок из таблицы PURCHASE, чтобы вернуть записи только о самых последних покупках каждого товара:
SELECT * FROM purchase
WHERE (product_name, purchase_date)
IN (SELECT product_name, MAX(purchase_date)
FROM purchase
GROUP BY product_name
) ;
4.3. Перенос данных между таблицами
Копирование записей из одной таблицы в другую важно уметь делать по целому ряду причин:
• импорт данных из унаследованной системы. Типичной задачей, возникающей при работе с SQL, является перенос данных из существующей системы в новую. Иногда существующая система просто заменяется новой. В других случаях нужно отображать и переносить в свою систему данные, полученные из внешнего источника. Зачастую исходные данные должны модифицироваться до занесения в новые таблицы, что может потребовать использования таких функций, как UPPER, LOWER, LTRIM, RTRIM, SUBSTR, INSTR, TO_CHAR и DECODE;
• загрузка итоговых значений в хранилище данных. Основной функцией хранилища данных (data warehouse) является хранение предварительно полученных ответов на часто задаваемые вопросы — имеются в виду те вопросы, на которые можно ответить с помощью функций SUM, COUNT, AVG, MIN и МАХ в сочетании с предложениями GROUP BY. Ответы обычно хранятся в отдельном наборе таблиц, которые заполняются путем выполнения SQL-запросов;
• копирование реляционных данных в плоские файлы для ускорения доступа. Реляционные базы данных обеспечивают наиболее эффективное хранение информации, но ее извлечение из реляционных таблиц может занимать довольно много времени, поскольку таблицы требуется соединять. В некоторых приложениях имеет смысл скопировать реляционные данные из многих таблиц в одну таблицу плоского файла, где все соединения уже выполнены. Таблица плоского файла занимает больше места, чем исходные реляционные таблицы, но доступ к ней может осуществляться быстрее, поскольку отпадает необходимость в соединениях.
Перенос данных с помощью оператора insert
Популярным способом переноса данных является использование команды INSERT с подзапросом, извлекающим вставляемые данные из другой таблицы. Для демонстрации этого приема можно создать таблицу командой
CREATE TABLE purchase_log (
purchase_date DATE,
product_name VARCHAR2(25),
product_price NUMBER(4,2),
quantity NUMBER(4,2),
sales_first_name VARCHAR2(15),
sales_last_name VARCHAR2(20)
)
;
Таблица PURCHASE_LOG — это "плоское" представление наиболее важной информации о каждой покупке: даты продажи, названия, цены и количества купленного товара, а также полного имени продавца. Подобная таблица хорошо подходит для получения ответов на вопросы типа: "Кто продал наибольшее и наименьшее количество Red Snaphoo?" Помещение в одну таблицу всей информации, необходимой для ответа на такие вопросы, позволяет получать ответы быстрее и гарантирует, что обращение к исходным таблицам не будет замедляться запросами от людей, которым нужно анализировать содержищиеся в этих таблицах данные.
Теперь, когда есть таблица плоского файла для хранения записей, подлежащих анализу, можно заполнить ее данными. Это будет сделано при помощи команды INSERT, соединяющей записи из таблиц PERSON, PRODUCT и PURCHASE. Ее синтаксис выглядит следующим образом:
INSERT INТО имя_таблицы (
оператор SELECT
) ;
Оператор SELECT — это любая команда SELECT, которая выдает нужные данные со структурой, соответствующей структуре таблицы назначения. Ниже приведен пример использования этого синтаксиса:
INSERT INTO purchase_log (
SELECT purc.purchase_date,
prod.product_name,
prod.product_price,
purc.quantity,
pers.first_name,
pers.last_name
FROM product prod,
person pers,
purchase purc
WHERE prod.product_name = purc.product_name
AND
pers.person_code = purc.salesperson
)
;
Таблица PURCHASE_LOG содержит удобные для анализа наборы данных о каждой продаже из таблицы PURCHASE.
Следует отметить, что в стандарте языка SQL предусмотрен многострочный оператор INSERT, выполняющий те же действия, но синтаксис которого отличается от приведенного выше отсутствием круглых скобок.