WHERE П.ПN=Пк.ПN
AND Гор LIKE 'М*')
AND
Д.ДN=П.ДN);
Покажем, как при помощи оператора EXISTS можно реализовать операции пересечения, разности и деления.
Пример. Пересечением таблиц Детали и Поставщики
по полю Гор является множество городов, в которых есть и детали, и поставщики:
SELECT DISTINCT Д.Гор FROM Детали AS ДEXISTS
(SELECT * FROM Поставщики П
WHERE Д.Гор=П.Гор);
Разностью между этими таблицами по полю Гор
является множество городов, в которых есть детали, но нет поставщиков:
SELECT DISTINCT Д.Гор FROM Детали ДNOT EXISTS
(SELECT * FROM Поставщики П
WHERE Д.Гор=П.Гор);
Операция пересечения может быть реализована и
без оператора EXISTS:
SELECT DISTINCT Д.Гор FROM Детали Д(SELECT COUNT (*) FROM Поставщики П
WHERE Д.Гор
= П.Гор)
>0;
(если количество найденных строк больше 0, значит они есть и оператор EXISTS принял бы значение “истина”).
При таком запросе производительность ниже, чем при использовании EXISTS, т.к. EXISTS возвращает результат, как только ему встретится хотя бы одна строка, удовлетворяющая условию, а COUNT (*) подсчитывает строки, просматривая таблицу до конца.
Пример реализации реляционной операции деления DIVIDED
BY: Получить номера
поставщиков, поставляющих все детали
SELECT DISTINCT Пк.ПNПоставки AS ПкNOT EXISTS
(SELECT Д.ДN FROM Детали AS Д
WHERE NOT EXISTS
(SELECT Пк1.ДN FROM Поставки AS Пк1
WHERE Пк1.ПN=Пк.ПN
AND
Пк1.ДN=Д.ДN));
Внешний запрос исследует каждый кортеж отношения Поставки и возвращает из него ПN, если вложенный запрос возвращает значение «Ложь». Вложенный запрос создает множество всех возможных значений ДN из отношения Детали. Из этого множества удаляются те значения ДN, которые состоят в паре с ПN в кортеже с тем же значением ПN, что и кортеж, рассматриваемый во внешнем запросе. Если рассматриваемый ПN комбинируется со всеми возможными значениями ДN, то результатом будет пустое множество и вложенный запрос возвратит значение «Ложь», т.е., не существует значений ДN, которые не состоят в паре с этим конкретным ПN.
Чтобы получить имена поставщиков, надо вложить
этот запрос в другой:
SELECT П.Имя_ППоставщики AS ПП.ПN IN
(SELECT DISTINCT Пк.ПNПоставки AS ПкNOT EXISTS
(SELECT Д.ДN FROM Детали AS Д
WHERE NOT EXISTS
(SELECT Пк1.ДN FROM Поставки AS Пк1
WHERE Пк1.ПN=Пк.ПN
AND
Пк1.ДN=Д.ДN)));
2.9 Запросы на изменение
Запросы на изменение предназначены для добавления, удаления или обновления записей, а также для создания таблиц.
Синтаксис запроса на добавление записей:
INSERT INTO таблица-получатель
SELECT список полей
FROM
таблица-источник;
Если в инструкции на добавление отсутствует предложение WHERE, то в таблицу-получатель будут добавлены все записи таблицы-источника.
Синтаксис запроса на удаление записей:
DELETE
FROM имя таблицы [WHERE
условие удаления];
В этой инструкции предложение WHERE также не обязательное. При его отсутствии из указанной таблицы будут удалены все записи.
Синтаксис запроса на создание таблицы:
SELECT список полей
INTO новая таблица
FROM исходная таблица
[WHERE
условие выбора];
Полную копию исходной таблицы можно создать, указав вместо списка полей символ * и не используя предложение WHERE.
Запрос на обновление используется для присвоения новых значений отдельным столбцам при помощи операторов UPDATE и SET:
имя таблицы
SET имя_поля_1=значение [,имя_поля_2=значение[,…]]
[WHERE
условие обновления];
2.10 Перекрестные запросы
Перекрестные запросы позволяют
создавать различные итоговые запросы, использующие статистические функции SQL.
Когда данные группируются с помощью перекрестного запроса, можно выбирать
значения из заданных полей или выражений как заголовки столбцов. Это позволяет
просматривать данные в более компактной форме, чем при работе с запросом на
выборку. <JavaScript:hhobj_3.Click()> Для организации перекрестных
запросов используются операторы Jet-SQL TRANSFORM и PIVOT:
TRANSFORM статистическая функция (имя поля) [AS наименование]
SELECT список полей
FROM имя таблицы
PIVOT
поле
[IN (значение_1[, значение_2[, ...]])];
Пример перекрестного запроса: Представить данные
о количествах деталей, поставленных каждым поставщиком.
TRANSFORM Sum(Пк.Кол)
Пк.ПN,
Sum(Пк.Кол)
AS [ВСЕГО:]Поставки
AS ПкBY
Пк.ПNПк.ДN;
Результатом такого запроса будет таблица:
|
ПN |
ВСЕГО: |
Д1 |
Д2 |
Д3 |
Д4 |
Д5 |
Д6 |
|
П1 |
900 |
900 |
|
|
|
|
|
|
П2 |
3200 |
|
|
3100 |
|
100 |
|
|
П3 |
700 |
|
|
200 |
500 |
|
|
|
П4 |
600 |
|
|
|
|
|
600 |
|
П5 |
3110 |
110 |
300 |
200 |
800 |
1000 |
700 |
Инструкция TRANSFORM является необязательной, но если она присутствует, то должна быть первой инструкцией в команде <JavaScript:hhobj_4.Click()> SQL. Она должна находиться впереди инструкции SELECT, которая указывает поля, содержащие заголовки строк, и предложения GROUP BY, которое задает группировку по строкам. При желании можно включить и другие предложения, например WHERE для описания дополнительных условий отбора и сортировки. Кроме того, можно использовать подчиненные запросы <JavaScript:hhobj_5.Click()> как предикаты в перекрестном запросе, особенно в предложении WHERE.
Значения, возвращенные аргументом поле, используются в качестве заголовков столбцов в результирующем наборе запроса. Аргумент поле можно ограничить, чтобы создать заголовки из фиксированных значений (значение_1, значение_2 ), перечисленных в необязательном предложении IN. Кроме того, фиксированные заголовки, которым не соответствуют реальные данные, можно использовать для создания дополнительных столбцов.
Используя SQL, можно обновить данные
или удалить записи таблиц, относящихся к другим базам данных любого типа
(FoxPro, dBase, Paradox,…). Для определения файла внешней таблицы или базы
данных используется оператор IN. Средствами MS ACCESS можно создавать или
изменять таблицы dBase или Paradox, указав в операторе IN путь к их файлу и тип
файла.
Литература
1. Агальцов, В.П. Базы данных. В 2-х т. Т. 2. Распределенные и удаленные базы данных: Учебник / В.П. Агальцов. - М.: ИД ФОРУМ, НИЦ ИНФРА-М, 2013. - 272 c.
. Агальцов, В.П. Базы данных. В 2-х т.Т. 1. Локальные базы данных: Учебник / В.П. Агальцов. - М.: ИД ФОРУМ, НИЦ ИНФРА-М, 2013. - 352 c.
. Голицына, О.Л. Базы данных / О.Л. Голицына, Н.В. Максимов, И.И. Попов. - М.: Форум, 2004. - 352 c.
. Голицына, О.Л. Базы данных: Учебное пособие / О.Л. Голицына, Н.В. Максимов, И.И. Попов. - М.: Форум, 2012. - 400 c.
. Карпова, И.П. Базы данных: Учебное пособие / И.П. Карпова. - СПб.: Питер, 2013. - 240 c.
. Кириллов, В.В. Введение в реляционные базы данных.Введение в реляционные базы данных / В.В. Кириллов, Г.Ю. Громов. - СПб.: БХВ-Петербург, 2012. - 464 c.
. Кошелев, В.Е. Базы данных в ACCESS 2007: Эффективное использование / В.Е. Кошелев. - М.: Бином-Пресс, 2009. - 592 c.
. Кузин, А.В. Базы данных: Учебное пособие для студ. высш. учеб. заведений / А.В. Кузин, С.В. Левонисова. - М.: ИЦ Академия, 2012. - 320 c.
. Ливена, С.В. Практика увольнений за прогул. По материалам базы данных "Пакет кадровика" / С.В. Ливена. - М.: ИНФРА-М, 2008. - 51 c.
. Пирогов, В.Ю. Информационные системы и базы данных: организация и проектирование: Учебное пособие / В.Ю. Пирогов. - СПб.: БХВ-Петербург, 2009. - 528 c.
. Советов, Б.Я. Базы данных: теория и практика: Учебник для бакалавров / Б.Я. Советов, В.В. Цехановский, В.Д. Чертовской. - М.: Юрайт, 2013. - 463 c.
. Фуфаев, Э.В. Базы данных: Учебное пособие для студентов учреждений среднего профессионального образования / Э.В. Фуфаев, Д.Э. Фуфаев. - М.: ИЦ Академия, 2012. - 320 c.