Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМП-БД.doc
Скачиваний:
17
Добавлен:
05.12.2018
Размер:
1.26 Mб
Скачать
  1. Многострочный оператор insert

Многострочный оператор insert добавляет в целевую таблицу несколько строк (более одной). В этой разновидности оператора insert значения данных для новых строк явно не задаются. Источником новых строк служит запрос на чтение, содержащийся внутри оператора insert.

Добавление строк со значениями, взятыми из той же базы данных, может сперва показаться странным, но иногда оказывается необходимым. Предположим, нам требуется скопировать номера, даты и стоимости всех заказов, сделанных до 1 января 1990 года, из таблицы orders в другую таблицу с именем oldorders, Многострочный оператор insert позволяет скопировать данные компактно и быстро:

Хотя многострочный оператор I nse rt выглядит сложнее однострочного, в действительности он является очень простым. В нем, как и в однострочном операторе insert, задаются таблица и столбцы, в которые заносятся новые элементы данных. Оставшаяся часть оператора представляет собой запрос, считывающий данные из таблицы orders. Вначале выполняется запрос к таблице orders, а затем таблица результатов этого запроса построчно добавляется в таблицу oldorders.

Вот еще одна ситуация, когда можно использовать многострочный оператор insert. Предположим, требуется проанализировать, что именно приобретают клиенты, и для этого необходимо просмотреть информацию о клиентах и служащих, имеющих большие заказы - стоимостью свыше $15000. Запросы, которые необходимо для этого выполнить, объединяют информацию из таблиц customers, salesreps и orders. В маленькой учебной базе данных эти трехтабличные запросы будут выполняться довольно быстро, но в реальной корпоративной базе данных, содержащей тысячи строк информации, выполнение таких запросов заняло бы длительное время

Вместо выполнения нескольких длинных трехтабличных запросов лучше создать для требуемых данных новую таблицу с именем bigorders, имеющую следующую структуру:

Столбец

Информация

amount

Стоимость заказа (из таблицы orders)

company

Имя клиента (из таблицы customers)

name

Имя служащего (из таблицы salesreps)

perf

Перевыполнение/недовыполнение плана (вычисляется по таблице SALESREPS)

mfr

Идентификатор производителя (из таблицы orders)

product

Идентификатор товара (из таблицы orders)

qty

Заказанное количество (из таблицы orders)

После создания таблицы bigqrders ее можно заполнить данными с помощью следующего оператора insert:

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

На запрос, содержащийся внутри многострочного оператора insert, стандарт SQL1 накладывает несколько логических ограничений:

• В запрос нельзя включать предложение order by. He имеет смысла сортировать таблицу результатов запроса, поскольку она добавляется в таблицу, которая, как и все остальные, не упорядочена.

• Таблица результатов запроса должна содержать такое же количество столбцов, что и оператор insert (или полностью всю целевую таблицу, если список столбцов опущен), а типы данных соответствующих столбцов таблицы результатов запроса и целевой таблицы должны быть совместимыми.

• Запрос не может быть запросом на объединение нескольких различных операторов select.

• Имя целевой таблицы оператора insert не может присутствовать в предложении from запроса на чтение или любого запроса, вложенного в него. Тем самым запрещается добавление таблицы самой в себя. В стандарте SQL2 последние два ограничения были ослаблены и в запросе допускаются объединения операторов, объединения таблиц и выражения; разрешается также "самодобавление".

Если принять, что в типичном случае ввод одной строки занимает полсекунды, то для интерактивного режима это, по-видимому, допустимое быстродействие. Но если необходимо загрузить 50000 строк данных, то такое быстродействие неприемлемо. Загрузка данных в этом случае заняла бы свыше шести часов.

По этой причине во всех коммерческих СУБД имеются средства пакетной загрузки, которые с высокой скоростью загружают данные из файла в таблицу. В стандарте SQL этот тип загрузки не упоминается, и обычно он осуществляется автономными служебными утилитами без участия SQL. Утилиты различных поставщиков СУБД немного отличаются набором функций, команд и свойств.