|
Программирование >> Sql: полное руководство
orders, a затем таблица результатов этого запроса построчно добавляется в таблицу oldorders. Таблица ORDERS OBDER NUHORDEB date CUST REP mfr product qty 112961 113012 112989 113051 113049 112987 113057 113042 17-DEC-89 ll-JAN-90 03-JAN-90 10-FEB-90 10-FEB-90 31-DEC-B9 1B-FEB-90 02-FEB-90 2117 2111 2101 2118 2118 2103 2111 2113 REI ACI FEA QSA QSA ACI ACI REI 2A44L 41003 114 XK47 XM7 4100Y 4100X 2A44R ahount J31,500 00 $3,745.00 J1,458.00 J1,420.00 J710.00 $27,500 00 $600 00 $22,500 00 Запрос на выборку SELECT ORDER NUM, ORDER DATE, AHOUKT FROH ORDERS WHERE ORDER DATE < Ol-JAN-90 Таблица OLDORDERS Результаты запроса на выборку
Вот еще одна ситуация, когда можно использовать многострочную инструкцию insert. Предположим, требуется проанализировать, что именно приобретают клиенты, и для этого необходимо просмотреть информацию о клиентах и служащих, имеющих больщие заказы - стоимостью свьште $15000. Запросы, которые необходимо для этого вьшолнить, объединяют информацию из таблиц customers, salesreps и orders. В маленькой учебной базе данных эти трехтабличные запросы будут вьшолняться довольно быстро, но в реальной корпоративной базе данных, содержащей тысячи строк информации, вьшолнение таких запросов заняло бы длительное время. Вместо выполнения нескольких длинных трехтабличньгх запросов лучше создать для требуемых данных новую таблицу с именем bigorders, имеющую следующую структуру: Столбец amount company name perf product qty Информация Стоимость заказа (из таблицы orders) Имя клиента (из таблицы customers) Имя служащего (из таблицы salesreps) Перевыполнение/недовыполнение плана (вычисляется по таблице salesreps) Идентификатор производителя (из таблицы orders) Идентификатор товара (из таблицы orders) Заказанное количество (из таблицы orders) После создания таблицы bigorders ее можно заполнить данными с помощью следующей инструкции insert: Загрузить в таблицу bigorders данные для анализа. INSERT INTO BIGORDERS (AMOUNT, COMPANY, NAME, PERF, PRODUCT, MFR, QTY) SELECT AMOUNT, COMPANY, NAME, (SALES - QUOTA) , PRODUCT, MFR, QTY FROM ORDERS, CUSTOMERS, SALESREPS WHERt: CUST = CUST NUM AND REP = EMPL NDM AND AMOUNT > 15000.00 6 rows inserted. В больших базах данных выполнение такой инструкции insert займет некоторое время, поскольку она содержит запрос к трем таблицам. После того как вьшолнение инструкции завершится, в таблице в ig0rders будет содержаться копия данных из других таблиц. Кроме того, таблица bigorders не будет автоматически изменяться при добавлении в базу данных новых заказов, поэтому данные в ней могут быстро устареть. Оба этих фактора выглядят как недостаток. Однако последующие запросы на выборку к таблице bigorders будут предсташтять собой запросы к одной таблице. Следует также отметить, что каждый из этих запросов будет вьшолняться намного быстрее, чем при использовании объединения. Поэтому копирование данных можно назвать хорошим методом проведения анализа, особенно если исходные таблицы являются большими. На запрос, содержащийся внутри многострочной инструкции insert, стандарт SQL1 накладывает несколько логических ограничений: В запрос нельзя включать предложение order by. Не имеет смысла сортировать таблицу результатов запроса, поскольку она добавляется в таблицу, которая, как и все остальные, не упорядочена. Таблица результатов запроса должна содержать количество столбцов, равное длине списка столбцов в инструкции insert (или полностью всю целевую таблицу, если список столбцов опущен), а типы данных соответствующих столбцов таблицы результатов запроса и целевой таблицы должны быть совместимыми. Запрос не может быть запросом на объединение (onion) нескольких различных инструкций select. Имя целевой таблицы инструкции insert не может присутствовать в предложении from запроса на выборку или любого запроса, вложенного в него. Тем самым запрещается добавление таблицы самой к себе. Первые два ограничения очевидны, а последние два были добавлены только для того, чтобы избежать излшиней сложности инструкции insert. Как результат, в стандарте SQL2 они были ослаблены, и в запросе допускаются операции union и join; разрешается также самодобавление . Утилиты пакетной загрузки Часто возникает необходимость загрузить в базу данных информацию из другого компьютера или из файла, в который она бьша собрана из различных источников. Для загрузки данных в таблицу можно было бы написать программу с циклом, в котором из файла считывается одна запись, а затем с помощью однострочной инструкции insert эта запись добавляется в таблицу. Однако накладные расходы , связанные с циклическим вьшолнением однострочной инструкции insert, могут оказаться очень высокими. Если принять, что в типичном случае ввод одной строки занимает полсекунды, то для интерактивного режима это, по-видимому, допустимое быстродействие. Но если необходимо загрузить 50000 строк данных, то такое быстродействие неприемлемо. Загрузка данных в этом случае заняла бы свыше шести часов По этой причине во всех коммерческих СУБД имеются средства пакетной загрузки, которые с высокой скоростью загружают данные из файла в таблицу. В стандарте SQL этот тип загрузки не упоминается, и обычно она осуществляется автономными служебными утилитами без участия SQL. Утилиты различных поставщиков СУБД немного отличаются набором функций, команд и свойств. Удаление существующих данных Удалять ту или иную строку из реляционной базы данных приходится тогда, когда объект, представляемый этой строкой, исчезает из внешнего мира . Скажем, в случае учебной базы возможны следующие варианты; ш если клиент отменяет заказ, необходимо удалить соответствующую строку из таблицы orders; если служащий увольняется из компании, должна быть удалена соответствующая строка из таблицы salesreps; если ликвидируется офис, необходимо удалить соответствующую строку из таблицы offices; в случае, когда служащие этого офиса увольняются, их строки в таблице salesreps также должны бьпъ удалены; если служащие переводятся в другой офис, то соответствующие значения в столбце office необходимо обновить. Во всех приведенных примерах новая строка удаляется для того, чтобы база данных оставалась точной моделью реального мира. Наименьшей единицей информации, которую можно удалить из реляционной базы данных, является одна строка. Инструкция DELETE Инструкция delete, синтаксическая диаграмма которой изображена на рис. 10.5, удаляет выбранные строки из одной таблицы. В предложении from указывается таблица, содержащая строки, которые требуется удалить. В предложении where указывается критерий отбора строк, которые должны быть удалены. I-DELETE FROM имя та6лицы - WHERE усповие от6ора- Предположим, что недавно принятый на работу Генри Якобсен решил уволиться из компании. Вот инструкция delete, удаляющая относящуюся к служащему строку из таблицы salesreps: Удалить информацию о Генри Якобсене из базы данных. DELETE FROM SALESREPS WHERE NAME = Henry Jacobsen 1 row deleted.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |