Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Итоги

Применение UPDATE к NULL-значениям

Предложение SET не является предикатом. В нем можно указать значение NULL без использования какого-либо специального синтаксиса (например, такого как IS NULL). Таким образом, если нужно установить все рейтинги покупателей из Лондо­

на (city = 'London') равными NULL-значению, необходимо ввести следующее пред­

ложение:

UPDATE Customers

SET rating NULL

WHERE city

·London ·;

В результате выполнения этой команды значения рейтинга для всех покупателей из Лондона станут неопределенными (имеющими NULL-значение).

Итоги

Вы овладели средствами манипулирования содержимым базы данных с помощью трех простых команд. INSERT используется для замены содержимого строк в базе данных, DELETE - для удаления строк, UPDATE - для замены значений в строках таблицы. Вы можете применять предикаты с UPDATE и DELETE для определения конкретных строк таблицы, на которые воздействует команда. Предикаты не имеют значения для команды INSERT, поскольку рассматриваемая в команде строка не суще­ ствует до тех пор, пока команда не выполнится. Однако, можно использовать запросы с INSERT для добавления множества строк в таблицу во время выполнения одной ко­ манды INSERT. Эти операции осуществляются при любом порядке расположения строк. Вы узнали, что значения, присваиваемые "по умолчанию", заносятся в те столб­ цы, значения которых явно не заданы. В операции может участвовать NULL-значение. Вновь обращаем ваше внимание на то, что в команде UPDATE можно использовать

выражения, а в INSERT - нельзя.

Следующая глава расширит знания в области применения этих команд и использо­ вания с ними подзапросов, сходных с уже известными. В главе 16 мы обсудим также

некоторые специальные вопросы и ограничения при использовании подзапросов в ко­

мандах языка DML.

165

Работае.м на SQL

1.Запишите команду, которая вводит следующие значения в заданном порядке

в таблицу Salespeople: city - San Jose, name - Blanco, comm - NULL, cnum - 1100.

2.Запишите команду, которая исключает все заявки покупателя Clemens из табли­

цы Orders.

3.Запишите команду, которая увеличивает рейтинг всех покупателей в Rome на

100.

4.Продавец Serres покинула компанию. Переведите ее покупателей продавцу

Motika.

(Ответы см. в приложении А.)

166

Использование

подзапросов

с командами обновления

Глава 16. Исllользование подзаllросов с командами обновления

Из этой главы вы узнаете, как применять подзапросы в командах обновления.

Эта операция похожа на использование подзапросов в запросах. Зная, как подзапросы применяются в командах SELECT, довольно просто, несмотря на некоторые отличия, освоить их использование в командах обновления.

Подзапросы полностью являются командами SELECT, а не предикатами, поэтому данная операция отличается от использования предикатов с командами обновления. Про­ стые запросы уже применялись для получения значения для INSERT, но теперь необходи­

мо расширить эти запросы включением в них подзапросов.

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

которую действует команда, т.е. на связанные подзапросы.

Использование подзапросов в INSERT

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

Предположим, есть таблица с именем SJpeop\e, определения столбцов которой полностью соответствуют определениям таблицы Salespeople. Известно, как запол­ нять таблицу, подобную этой, для всех покупателей (Customers), расположенных (city)

в San Jose:

INSERT INTO SJpeople

SELECT *

FROM Salespeople

WHERE city = ·san Jose·;

Теперь можно использовать подзапрос, для того чтобы добавить в таблицу SJpeople всех продавцов, имеющих покупателей в San Jose, независимо от места Про­

живания продавца:

INSERT INTO SJpeople

SELECT *

FROM Salespeople

WHERE snum = ANY

(SELECT snum

FROM Customers

168

Ис1tолыование 1tодзапросов в JNSERT

WHERE city = ·san Jose');

Оба запроса в этой команде действуют так, будто они не являются частью выраже­ ния INSERT. Подзапрос отыскивает все строки для покупателей в San Jose и создает множество значений поля snum. Внешний запрос выбирает те строки из таблицы Salespeople, для которых найдены совпадающие значения snum. В данном примере в таблицу SJpeople вставляются строки для продавцов Rifkin и Serres, которым назначе­

ны покупатели из San Jose Liu и Cisneros.

Включение (предотвращение включения) одинаковых

строк

Последовательность команд в предыдущем разделе может показаться проблема­ тичной. Продавец Serres расположен в San Jose и, следовательно, будет добавлен в таблицу после выполнения первой команды. Вторая команда будет пытаться добавить его снова, поскольку он имеет покупателя в San Jose. Если имеются какие-либо огра­ ничения для SJpeople, в соответствии с которыми значения должны быть уникальны­ ми, это второе появление (вторая вставка той же самой строки) может оказаться ошибочным. Дублирование строк - не самая удачная идея. Для того чтобы прокон­ тролировать наличие в таблице значения, которое вставляется добавлением другого подзапроса (с использованием операторов EXISTS, IN, <>ALL и т.д.) для предиката, нужна ссылка на саму таблицу SJpeople в предложении FROM этого нового подзапро­ са, но нельзя ссылаться на таблицу, находящуюся в процессе формирования (как еди­ ного целого), в любом подзапросе команды обновления. В случае с INSERT, это также исключает возможность использования связанных подзапросов, базирующихся на таблице, в которую вносятся значения, что существенно, поскольку при использова­ нии INSERT создается новая строка таблицы. "Текущая" строка не существует до тех пор, пока INSERT не закончит ее обрабатывать.

Использование подзапросов, основанных на таблицах

внешних запросов

Запрет на использование ссылок на таблицу, находящуюся в процессе изменения командой INSERT, не мешает применять подзапросы, которые ссылаются на таблицу (таблицы), используемую в предложении FROM внешней команды SELECT. Таблица, из которой осуществляется выборка данных для получения значения дr1я INSERT, не находится в состоянии изменения командой, и на нее можно ссылаться любым извест­ ным способом, как если бы это было отдельным запросом.

Предположим, существует таблица Samecity, в которой хранятся сведения о про­ давцах (salespeople), имеющих покупателей в их же городах (cities). Можно заполнить таблицу, применяя связанные подзапросы:

INSERT INTO Samecity

169

Источник: https://studfile.net/preview/16418473/