Языки манипулирования данными. Карепова Е.Д. - 20 стр.

UptoLike

Составители: 

39
использования, а значительное отличие логики от разговорной речи может
вообще привести к неправильно составленному запросу.
В отличие от квантора (NOT) EXISTS синтаксис операторов ALL,
ANY, SOME предполагает наличие одного из операторов сравнения (=, !=, >,
>=, <, <=). Операторы ANY и SOME взаимозаменяемы, и употребление како-
го-либо из них лишь дело вкуса программиста.
С помощью ALL (SubQuery), предикат является верным, если каждое
значение, выбранное подзапросом, удовлетворяет условию в предикате
внешнего запроса. Оператор ALL используется в основном с неравенствами,
поскольку « = ALL (SubQuery) » имеет смысл, только если результатом за-
проса является одно значение или колонка совпадающих значений.
Запрос: Определить Ф.И.О. студентов, сдавших экзамены по наиболь-
шему количеству предметов.
Решение:
SELECT ID_Stud, СФам FROM СТУДЕНТ AS СТ
WHERE ID_Stud IN (SELECT У1.ID_Stud, У1.ID_Subj, COUNT(*)
FROM УСПЕВАЕМОСТЬ AS У1
WHERE СТ.ID_Stud = У1. ID_Stud
GROUP BY У1.ID_Stud, У1.ID_Subj
HAVING COUNT(*) > ALL (SELECT COUNT(*)
FROM УСПЕВАЕМОСТЬ AS У2
WHERE CT.ID_ ID_Stud != У2. ID_Stud
GROUP BY У2.ID_Stud, У2. ID_Subj))
Этот запрос можно записать более оптимально и естественно с помо-
щью функции MAX. Здесь он приведен только для иллюстрации использова-
ния оператора ALL.
При употреблении операторов ALL, ANY (SOME) необходимо учиты-
вать следующие правила.
Любой запрос, который может быть сформулирован с ALL, ANY
(SOME), может быть сформулирован с помощью квантора всеобщности
EXIST. Обратноене верно.
« < ANY (SubQuery) » – значение меньшее, чем наибольшее выбран-
ное в (SubQuery) значение, а « > ANY (SubQuery) » – значение большее, чем
наименьшее выбранное в (SubQuery) значение.
« != ALL (SubQuery) » следует понимать как «не равно любому ре-
зультату подзапроса».
Если подзапрос возвращает пустое множество строк, то выражение
«ALL (SubQuery)» является истинным, а «ANY (SubQuery)» – ложным.
ОПЕРАТОРЫ МОДИФИКАЦИИ ДАННЫХ
Вставка данных
Общий синтаксис оператора вставки следующий.
40
Синтаксис:
INSERT INTO <имя_таблицы | имя_представления>
[(<имя_поля> {, <имя_поля2> }…)]
{VALUES <список_значений> | <подзапрос>}
В своем простейшем виде оператор INSERT позволяет вставлять в таб-
лицу новые строки путем непосредственного задания значений каждого поля.
Если при этом заполняются все поля таблицы, то имена полей можно не ука-
зывать, а порядок вводимых значений должен соответствовать порядку по-
лей, использованному при описании структуры таблицы. Если же какое-то
значение вводить не надо, то на его место следует поставить NULL. Чтобы
присвоить значения не всем полям строки или изменить порядок ввода зна-
чений, следует явно задавать список полей после имени таблицы. Значения в
VALUES не могут быть вычисляемыми выражениями.
Запрос: Добавить в таблицу УСПЕВАЕМОСТЬ результаты экзамена
по физике (ID_Subj = ‘К3’) для студентов с ID_Stud ‘003’ и ‘002’.
Решение:
INSERT INTO УСПЕВАЕМОСТЬ
VALUES (‘003’, ‘K3’, 3, 4, ‘002’, ‘K3’, 3, 4)
Другая возможность оператора INSERT – это вставка данных на основе
запроса. Для этого вместо VALUES следует указать подзапрос, который и
сформирует вводимые строки. Однако предложение FROM этого подзапроса
не должно содержать ссылок на таблицу, в которую вставляют строки, то
есть нельзя использовать коррелированные подзапросы.
Запрос: Перенести все сведения об отличниках в отдельную таблицу
ОТЛИЧНИК.
Решение:
INSERT INTO ОТЛИЧНИК
(S_Num, ФИО, Дисциплина, Num_Sem, Балл)
SELECT ID_Stud, СФам, Наименование, Семестр, Оценка
FROM СТУДЕНТ, УСПЕВАЕМОСТЬ, КУРС
WHERE СТУДЕНТ.ID_Stud = УСПЕВАЕМОСТЬ.ID_Stud
AND КУРС.ID_Subj = УСПЕВАЕМОСТЬ.ID_Subj AND
NOT EXISTS
(SELECT * FROM УСПЕВАЕМОСТЬ AS У1
WHERE СТУДЕНТ.ID_Stud=У1.ID_Stud AND
Оценка<>5)
Замечание: Таблица ОТЛИЧНИК должна существовать в базе данных
(т.е. описана оператором CREATE TABLE). Типы полей S_Num, ФИО, Дис-
циплина, Num_Sem, Балл должны совпадать с типами соответствующих по-
лей ID_Stud, СФам, Наименование, Семестр, Оценка из таблиц СТУДЕНТ,
УСПЕВАЕМОСТЬ, КУРС.
Замечание: Таблицы ОТЛИЧНИК и СТУДЕНТ, УСПЕВАЕМОСТЬ,
КУРС никак не связаны между собой, если в дальнейшем, отличник получит
двойку или сменит фамилию, то изменения, внесенные в последние три таб-