Программирование >>  Реляционные базы данных 

1 ... 73 74 75 [ 76 ] 77 78 79 ... 125


228 Глава 5 Язык Саз данных SQL

!! О Для каждого класса, содержащего не менее трех кораблей, определите число кораблей этого класса, потопленных в сражении.

!! g) Вес снаряда (в фунтах), выпускае.мого орудие.ч, прн.мерно равен патовине куба его калибра (в дюймах). Определите средний вес снарядов для кораблей каждой страны.

5.6 Изменения базы данных

До сих пор мы рассматривали нормааьную форму запросов SQL - выражения типа select-f-oni-\vliere. Су1нестуют и другие формы SQL-предложений, которые не возвращают ответы, а изменяют состояние БД. В этом разделе мы сосредоточимся на выражениях трех типов, позволяющих:

L Встааплть кортежи в отнощения

2. Удалять кортежи из отношений

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

5-6.1 Операция вставки

Основная форма предложения вставки состоит из следующих частей: L Ключевого слова INSERT INTO

2. Имени отношения Л

3. Заключенного в скобки списка атрибутов отношения R

4. Ключевого слова VALUES

5- Выражения кортежа, т.е. заключенного в скобки списка конкретных значений, содержащего по одному значению для каждого атрибута из списка, упомянутого в пункте (3).

Запись основной формы вставки:

INSERT INTO R{A......А ) VALUES ( > v ):

Кортеж строится применением значения v, для атрибута Aj при /=1.2,.... п. Еслн в список входят не все атрибуты отношения Л, для недостающих атрибутов в создаваемом кортеже используются значения, принятые по умолчанию. Они обсуждаются в разделе 5.7.3. Самым распросграненным из них является значение NULL, которое рассматривается в контексте SQL в разделе 5.9. Здесь же мы будем считать NULL меткой-заполнителем, применяемой тогда, когда правильное значение компонента неизвестно.

Пример 5.27. Предположим, нужно добавить Sydney Greenstreei к списку кинозвезд, занятых в филь.ме 7/ге Maltese Falcon . Для этого фopмyJmpyeтcя предложение:

1) INSERT INTO Starsln(movieTit1e. movieYear, starName)

2) VALUES(Ttie Л/laltase Falcon, 1942, Sydney Greenstreef);

В результате его выполнен ! коргеж с зремя компонентами, указанный на строке (2), вставляется и отноцЕение Starsln. Поскольку на строке (I) персчис.пены все етрибуты Starsln. компоненты, принимаемые по умолчанию, не нужны. Значения на строке (2) соответствуют атрибутам на сгроке (I) в заданном порядке, поэтому The Maltese Falcon становится значением компонеггга для атрибута movieTitle п т.п. □



Если все-атрибуты отношения обеспечены значениями, как в примере 5.27, список атрибутов, следующий за именем отношения, можно пропустить и писать просто:

INSERT INTO Starsin

VALUES(The Maltese Falcon, 1942, Sydney Greenstreef);

Однако в этом случае мы должны быть уверены, что порядок значений совпадает со стандартным порядком расположения атрибугов отношения. В разделе 5.7 будет показано, как строятся с.чемы отношений и как при этом задается порядок атрибутов. Такой порядок предполагается при установлении соответствия между значени-я.ми и атрибутами, когда список атрибутов явно ие указан в предложении INSERT. Если стандартный порядок атрибутов не гарантирован, лучше явно перечислить их в произвольно выбранном порядке.

Приведенное выше простое предложение INSERT вставляет в отношение только один кортеж. Вместо применения явно указанных значений для одного кортежа с помощью подзапроса можно вычислить множество кортежей, которое необхоаимо ввести в отношение. Подзапрос заменяет ключевое слово VALUES и выражение кортежа в предложении INSERT описанной выше формы.

Пример 5.28. Предположим, нужно вставить в отношение

Studi(name. address, presC#) все студии, которые упомянуты в отношении

Mov e(title. year, length, inColor. studюName, producerC#)

HO не входят в Studio. Поскольку адреса или имена президентов таких студий определить невозможно, для атрибутов address и presC# вставляемых кортежей Studio при-ходится применять значение NULL. Такой способ вставки представлен на рис. 5.12.

1) INSERT INTO Studio(name)

2) SELECT DISTINCT studioName

3) FROM Movie

4) WHERE StudioName NOT IN

5) (SELECT name

6) FROM Studio);

Рис, 5.12. Добоаление новых студий

Выполнение этого предложения, как и большинства вложенных запросов SQL, проще всего начинать изнутри. Строки (5) и (6) порождают все названия ст>дий в отношении Studio. Строка (4) устанавливает, что в число этих студий не входит ни одной студни из отношения Movie.

Итак, строки (2) - (6) порождают множество названий студий, входящих в Mov е, но не в Studio. Применение DISTINCT в строке (2) гарантирует, что каждая студия входит в это множество только один раз, независимо от того, с каким числом фильмов она связана. И наконец, строка (I) вставляет каждую из этих студий со значением NULL для атрибутов address и presCtf в отношение Studios. □

5.6.2 Операция удаления

Предложение удаления состоит из следующих компонентов:

1. Ключевого слови DELETE FROM

2. Имени отношения, например R



230 Глава 5 Язык баз данных SQL

3. Юмочевого слева WHERE

4. Условия

Форма записи операции удаления:

DELETE f ROM R WHERE <условие>;

В результате се выполнения каячдып уяоилетвсряющнП усоовию (4) кортел удаляется из огношения R.

Пример 5.29. Из отношения

Starsln(movieTitle, movieYear, starName)

можно удалить информацию о том, что Sydney Greenstreei играл в фильме The Mahese Falcon , используя следующий запрос SOL:

DELETE FROM Starsln

WHERE movieTitle = The Maltese Falcon AND movieYear = 1942 AND

StarName = Sydney Greenstreef;

Заметим, что здесь, в отличие от запроса из примера 5.27, нельзя просто задать удаление кортежа, а нужно точно описать этот кортеж в пункте WHERE. □

Синхронизация вставок

Рис. 5.12 иллюстрирует определенный недостаток семантики предложений SQL. В принципе оценка строк запроса (2) (6) должна проводиться до выполнения вставки согласно строке (1). Поэтому новые кортежи, добавляемые в отношение Studio согласно строке (Г), не могут повлиять на условие строки (4). Однако в целях повышения эффективности запроса при определенной реализации его можно выполнять так, что в процессе обработки строк (2) - (6) изменения в Studio выполняются сразу, как только найдена очередная новая студия.

В данном частном примере неважно, откладываются ли вставки до завершения оценки всего запроса. Но в других запросах результат можно изменить, варьируя синхронизацию вставок. Допусгим, DISTINCT удаляется из строки (2) запроса 5.12. Тогда, если строки (2) -(6) оиениваются до любой вставки, новое название студни, входящее в несколько кортежей отношения Movie несколько раз войдет в результат запроса, а следовательно, и в отношение Studio, Если же новые студии вводятся в отношение Studio сразу при обнаружении их Б процессе запроса на строках (2) - (6), одна и та же студия не будет введена дважды. Действительно, как только новая студня вводится в отношение, ее название перестает удовлетворять условию строк (4) - (6) и уже не появится вторично в результате запроса, указанного на строках (2) - (6)

Пример 5.30. Б качестве еще одного примера удалим из отношения

MovieExec(name. address, cert#. netWorth)

сразу несколько кортежей с помощью специального условия, которому может удовлетворять множесгво кортежей. Предложение

DELETE FROM MovieExec WHERE netWorth < 10000000

)Жшяст всех продюсеров фильмов, чистый доход которых меньше 10 млн. дол. О



1 ... 73 74 75 [ 76 ] 77 78 79 ... 125

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика