Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диго С.М. Базы данных проектирование и использование.doc
Скачиваний:
725
Добавлен:
14.05.2016
Размер:
12.04 Mб
Скачать

Запросы, затрагивающие несколько таблиц

В SQL запросы, затрагивающие несколько таблиц, могут реализовываться различными способами. Во-первых, условия соединения таблиц могут быть заданы в предложении WHERE. Во-вторых, воз­можно применение вложенных запросов. В-третьих, можно исполь­зовать встроенные операторы JOIN, включаемые в предложение FROM (что рассматривалось выше). Последняя из указанных возмож­ностей была включена в SQL сравнительно недавно (начиная с SQL-92). Использование встроенных операторов JOIN часто помогает упрос­тить написание запроса. Встроенные операторы JOIN реализованы не во всех диалектах SQL. В случае их отсутствия (или в силу при­вычки) можно запросы реализовать и без использования JOIN.

Один и тот же запрос может быть реализован несколькими спосо­бами.

Рассмотрим следующий пример. Пусть имеются две таблицы. Первая («Postavka») содержит сведения о поставках продукции и включает колонки: Код поставщика (kod_post), Код продукции {kod_prod), Дата поставки (dat_post), Количество поставленной про­дукции (kolv). Вторая таблица («Sp_post») содержит колонки Код по­ставщика и Наименование поставщика (naim_pst). Требуется выдать наименования поставщиков, которые поставляют товар с кодом Р2.

Возможны следующие варианты задания этого запроса:

1 - пример простого вложенного подзапроса

SELECT naim_post

FROM sp_post

WHERE kod_post IN

(SELECT kod_post FROM postavka WHERE kod_prod="P2");

2 - пример коррелированного подзапроса

SELECT naim_post

FROM sp_post

WHERE "P2" IN

(SELECT kod__prod FROM postavka

WHERE sp_post.kod_post=postavka.kod_post);

3 - вместо вложенных подзапросов используется задание усло­вия связывания таблиц

SELECT naim_post

FROM sp_post,postavka

WHERE postavka.kod_post=sp_post .kod_post

AND postavka.kod_prod="P2";

4 - возможность использования квантора существования при задании запроса

SELECT naim_post

FROM sp_post

WHERE EXISTS (SELECT * FROM postavka

WHERE kod_post=sp_post.kod_post

AND kod_prod="P2");

5 - использование встроенного оператора JOIN

SELECT naim_post

FROM sp_post INNER JOIN postavka ON sp_post.kod_post= postavka.kod_post

WHERE kod_prod="P2";

Следует обратить внимание, что оптимизатор должен выбирать оптимальный план реализации запросов, и в идеале время выполне­ния правильно заданного запроса не должно зависеть от способа его написания. Однако в действительности дело обстоит иначе, и по-раз­ному записанные запросы, в результате выполнения которых получа­ется один и тот же ответ, могут потребовать разного количества вре­мени для своей реализации.

Корректирующие операторы

Оператор INSERT. Он позволяет включить в таблицу новые строки

INSERT INTO имя таблицы

[(имя столбца .,..)]

выражение запроса | конструктор значений таблицы

|{DEFAULT VALUES}

Если список колонок не задан, то значения должны вводиться в каждую колонку таблицы; если список колонок задан, то значения соответственно должны вводиться в те колонки, которые перечисле­ны в списке, и в том порядке, в котором они расположены в нем.

Элементы в списке значений могут быть константами, функция­ми, переменными памяти. Если эти элементы являются константами, то при их задании используются определенные разделители в зависи­мости от типа вводимых данных: символьные данные заключаются в кавычки, даты - в фигурные скобки, логические - в точки, числовые данные вводятся без разделителей.

Пример использования оператора INSERT:

INSERT INTO cennik

VALUES ("железо", "MOOOl", "T", 33.50);

В данном примере значения вводятся во все колонки таблицы {см. описание таблицы «Cennik»), поэтому <список колонок> не указан.

Если значения, которые необходимо ввести, являются результа­том выполнения запроса, то эти значения также помещаются в спе­цифицированные колонки и должны соответствовать им по типу. При использовании <подзапроса> в указанную таблицу вводятся данные, отобранные из другой таблицы (или даже нескольких таблиц).

Оператор UPDATE. Командой, позволяющей корректировать со­держание таблицы, является оператор UPDATE, имеющий следую­щий формат:

UPDATE <имя таблицы> SET <имя столбца>=<новое значение>

[,<имя столбца>=<новое значение:»...]

[<предложение WHERE>];

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

Оператор

UPDATE vrbt SET rascen=rasscen*10;

увеличивает расценки для всех записей в таблице «Vrbt» в 10 раз.

Оператор

UPDATE vrbt SET vrbt=1 WHERE koddet="B11";

устанавливает для записей, удовлетворяющих условию KODDET = "В 11", значение поля vrbt, равное 1.

Оператор DELETE. Его можно использовать для удаления строк таблицы:

DELETE

FROM <имя таблицы>

[<предложение WHERE>];

Например, оператор

DELETE

FROM cennik

WHERE naimmat="железо";

удалит из таблицы «Cennik» строку с naimmat=”железо”.

Следует быть осторожным при использовании оператора DELETE, поскольку, если фраза WHERE в операторе DELETE отсутствует, будут удалены все строки таблицы. То же самое произойдет, если неправильно указать условие отбора и в результате не будет ото­брано ни одной строки в таблице. Оператор DELETE физически уда­ляет строки таблицы.