Манипулирование данными
Использование подзапросов с DELETE
Пусть филиал университета в Нью-Васюках ликвидирован и требуется удалить из таблицы STUDENT записи о студентах, которые там учились. Эту операцию можно выполнить с помощью запроса
DELETE
FROM STUDENT
WHERE UNIV_ID IN
(SELECT UNIV_ID FROM UNIVERSITY WHERE CITY = 'Нью-Васюки');
В предикате предложения FROM (подзапроса) нельзя ссылаться на таблицу, из которой осуществляется удаление. Однако можно ссылаться на текущую строку из таблицы, являющуюся кандидатом на удаление, то есть на строку, которая в настоящее время проверяется в основном предикате.
DELETE FROM STUDENT WHERE EXISTS (SELECT *
FROM UNIVERSITY 1,1
WHERE RATING = 401
AND STUDENT.UNIV_ID = UNIVERSITY. UNIV_ID) ;
Часть AND предиката внутреннего запроса ссылается на таблицу STUDENT. Команда удаляет данные о студентах, которые учатся в университетах, имеющих рейтинг, равный 401. Существуют и другие способы решения этой задачи.
DELETE
FROM STUDENT WHERE 401 IN
(SELECT RATING FROM UNIVERSITY WHERE STUDENT. UNIV_ID = UNIVERSITY. UNIV ID) ;
Пусть нужно найти наименьшее значение оценки, полученной в каждый день сдачи экзаменов, и удалить из таблицы сведения о студенте, который получил эту оценку. Запрос будет иметь вид:
DELETE
FROM STUDENT
WHERE STUDENT_ID IN
(SELECT STUDENT_ID FROM EXAM_MARKS A
WHERE MARK= (SELECT MIN(MARK)
FROM EXAM_MARKS В
WHERE A.EXAM_DATE = В.EXAMJDATE) ) ;
Так как столбец STUDENT_ID является первичным ключом, то удаляется единственная строка.
Если в какой-то день сдавался только один экзамен (то есть получена только одна минимальная оценка) и по какой-либо причине запись, в которой находится эта оценка, требуется оставить, то решение будет иметь вид:
DELETE
FROM STUDENT
WHERE STUDENT_ID IN
(SELECT STUDENT_ID FROM EXAM_MARKS A WHERE MARK =
(SELECT MIN(MARK) FROM EXAM_MARKS В
WHERE A.EXAM_DATE = B.EXAM_DATE AND 1 <
(SELECT COONT(SUBJ_ID) FROM EXAM_MARKS В WHERE A.EXAM_DATE = В.EXAM_DATE) ) ) ;
3.2.3. Использование подзапросов с UPDATE
С помощью команды UPDATE можно применять подзапросы в любой форме, приемлемой для команды DELETE.
Например, используя связанные подзапросы, можно увеличить значение размера стипендии на 20 в записях студентов, сдавших экзамены на 4 и 5.
UPDATE STUDENT1
SET STIPEND = STIPEND + 20
WHERE 4 <=
(SELECT MIN(MARK) FROM EXAM_MARKS WHERE EXAM_MARKS.STUDENT_ID = STUDENT1 .STUDENT_ID) ;
Другой запрос: «Уменьшить величину стипендии на 20 всем студентам, получившим на экзамене минимальную оценку».
UPDATE STUDENT1 SET STIPEND = STIPEND - 20 WHERE STUDENT_ID IN (SELECT STUDENT_ID
FROM EXAM_MARKS A WHERE MARK =
(SELECT MIN(MARK) FROM EXAM_MARKS В WHERE A. EXAM DATE = B . EXAM DATE));
Упражнения
1. Пусть существует таблица с именем STUDENTI, определения столб цов которой полностью совпадают с определениями столбцов таб лицы STUDENT. Вставить в эту таблицу сведения о студентах, ус пешно сдавших экзамены более чем по пяти предметам обучения.
Напишите команду, удаляющую из таблицы SUBJECTI сведения о предметах обучения, по которым студентами не получено ни од ной оценки.
Напишите запрос, увеличивающий данные о величине стипендии на 20% всем студентам, у которых общая сумма баллов превышает значение 50.
| Maya 3D графика в кино и телевидении Воздействие испытаний ядерного оружия на здоровье населения Объектно-ориентированный язык программирования Java Объектно-ориентированное программирование Delphi Библиотека визуальных компонентов VCL и ее базовые классы Кроссплатформенное программирование для Linux Элементы управления Win32 Элементы управления Windows XP Файлы и устройства ввода/вывода Что такое экспертная система? Объектно-ориентированное программирование Инструментальные средства разработки экспертных систем Программирование на языке CLIPS Критерии и количественные характеристики надежности Расчет характеристик надежности невостанавливаемых резервированных изделий Расчет надежности системы с постоянным резервированием Интегрирование тригонометрических функций ; |