проверяемое_выражениеВложенный _запрос
=
< >
<
< =
>
> =
2.Проверка на принадлежность результатам вложенного запроса. Проверяет значение выражения на равенство с одним из значений множества, возвращенного вложенным запросом:
Пример запроса: вывести список квартир, в которых не установлены телефоны:
SELECT * FROM FLAT
WHERE ADR NOT IN (SELECT ADR FROM TPHONE)
3.П
вложенный
_запрос
EXISTS
NOT
Пример запроса: вывести список жителей, имеющих источник дохода с размером большим 1000 руб.:
SELECT * FROM PERSON
WHERE EXISTS (SELECT * FROM PROFIT, HAVE_D
WHERE PERSON.NOM=HAVE_D.NOM
AND PROFIT.ID=HAVE_D.ID
AND PROFIT. MONEY>1000)
Обратите внимание на то, что условие поиска EXISTS не использует результаты вложенного запроса. Проверяется только наличие результатов. По этой причине в SQL смягчается правило о единственности возвращаемого столбца во вложенном запросе и во вложенном запросе при проверке EXISTS допускается использование формы SELECT *.
4. Многократное сравнение. Сравнивает значение выражения с каждым из значений множества, возвращаемого вложенным запросом:
проверяемое
_выражение вложенный
_запрос
=ANY
< >ALL
<
< =
>
> =
При проверке ANY проверяемое значение поочередно сравнивается с каждым значением, содержащимся в столбце, который сформирован вложенным запросом. Если любое из этих сравнений дает результат TRUE, то проверка ANY возвращает значение TRUE.
При проверке ALL проверяемое значение поочередно сравнивается с каждым значением, содержащимся в столбце данных, выбранных вложенным запросом. Если все сравнения дают результат TRUE, то проверка ALL возвращает значение TRUE.
Внесение изменений в БД: добавление, удаление и обновление данных
Внесение изменений в базу данных
Язык SQL позволяет не только извлекать информацию из БД с помощью запросов на чтение, но и изменять содержащуюся в ней информацию с помощью запросов на добавление, удаление и обновление.
По сравнению с оператором SELECT, задающим запросы на чтение, операторы языка SQL, изменяющие содержимое БД, являются более простыми. Однако при изменении содержимого БД к СУБД предъявляется ряд дополнительных требований. При внесении изменений СУБД должна сохранять целостность данных и разрешать ввод в БД только допустимых значений, а также обеспечивать возможность одновременного изменения БД несколькими пользователями, чтобы они не мешали друг другу.
Добавление новых данных
Наименьшей единицей информации, которую можно добавить в реляционную БД, является одна строка. Существует два способа добавления новых строк в БД:
1) однострочный оператор INSERTпозволяет добавить в таблицу новую строку (рис. 1);
2) многострочный оператор INSERTобеспечивает извлечение строк из одной части БД и добавление их в другую таблицу (рис. 3.18).
INSERT INTO имя_таблицы
( имя_столбца )
,
VALUES ( константа )
NULL
,
Рис. 1. Синтаксическая диаграмма однострочного оператора INSERT
В предложении INTO указывается целевая таблица, в которую добавляется новая строка, а в предложении VALUES содержатся значения данных для новой строки. Список столбцов определяет, какие значения в какой столбец заносятся.
Например, можно задать запросы для внесения в БД сведений о новой квартире, установке телефона в этой квартире и заселении этой квартиры новым жильцом:
а) INSERT INTO FLAT
VALUES (‘Зеленоград, 1001-45’, 40, 3,’H’)
б) INSERT INTO TPHONE (ADR, NTEL, TCATEGORY)
VALUES (‘Зеленоград, 1001-45’, ’999-1199’, ’С’)
в) INSERT INTO PERSON (NOM, FIO, RDATE, POL, ADR)
VALUES(14,’Кукушкин Жан Ильич’,’03/13/77’,’M’,’Зеленоград, 1001-45’)
Если список столбцов опущен, то последовательность значений данных должна точно соответствовать порядку столбцов в таблице (см. а)).
В списке столбцов их имена могут указываться в любой удобной последовательности, определяющей затем порядок значений данных в предложении VALUES (см. б)).
При добавлении в таблицу новой строки всем столбцам, имена которых отсутствуют в списке столбцов оператора INSERT, СУБД автоматически присваивает значение NULL либо значение, заданное по умолчанию при описании структуры таблицы (см. в)), где отсутствует имя столбца SUMD).
Список столбцов в операторе INSERT служит, чтобы установить соответствие между значениями данных, содержащимися в предложении VALUES, и столбцами, для которых эти данные предназначены. Списки значений и столбцов должны содержать одинаковое число элементов, а тип данных каждого значения должен соответствовать типу соответствующего столбца.
INSERT INTO имя_таблицы запрос
( имя_столбца )
,
Рис. 2. Синтаксическая диаграмма многострочного оператора INSERT
Многострочный оператор INSERT добавляет в целевую таблицу одну или несколько строк. Источником новых строк служит запрос на чтение, содержащийся внутри оператора INSERT.
Например, можно добавить в таблицу PERSON сведения о новом жителе, у которого общий доход будет таким же, как у жителя с номером 16:
INSERT INTO PERSON
SELECT 20,’Алов Наум Нилыч’,’05/20/49’,’M’, SUM (MONEY),
‘Зеленоград, 1001-45’ FROM HAVE_D, PROFIT
WHERE NOM=16 AND HAVE_D.ID=PROFIT.ID
Такой способ определения общего дохода у жителя с номером 16, требующий осуществления соединения двух таблиц и использования агрегатной функции, обусловлен стандартом SQL1, который требует, чтобы имя целевой таблицы оператора INSERT не присутствовало в предложении FROM запроса, вложенного в него, т. е. запрещается добавление таблицы самой в себя.
В стандарте SQL2 это ограничение отсутствует, и «самодобавление» разрешено. Следовательно, рассмотренный пример можно модифицировать следующим образом:
INSERT INTO PERSON
SELECT 20, ’Алов Наум Нилыч’,’05/20/49’,
’M’ ,SUMD,’Зеленоград, 1001-45’
FROM PERSON WHERE NOM=16
Если в БД имеется таблица OLD_PERSONдля хранения сведений о пожилых гражданах, то данные в нее можно добавить из таблицы PERSON с помощью такого многострочного оператора INSERT:
INSERT INTO OLD_PERSON (NOM, FIO, RDATE, ADR)
SELECT NOM, FIO, RDATE, ADR FROM PERSON WHERE RDATE < ’01/01/1949’