Операторы манипулирования данными
В операции манипулирования данными входят три оператора: удаления записей — DELETE, добавления новых записей — INSERT и изменения (обновления записей) — UPDATE. Все операторы манипулирования данными позволяют изменить данные только в одной таблице.
Оператор ввода данных INSERT имеет следующий синтаксис:
INSERT INTO имя_таблицы [(<список столбцов>) ] VALUES (<список значений>)В общем случае можно ввести только одну строку в таблицу. Задание списка столбцов необязательно тогда, когда мы вводим строку с заданием значений всех столбцов таблицы. Например, введем новую книгу в таблицу BOOKS (БД «Библиотека»):
INSERT INTO BOOKSVALUES (‘3-77777-444-2’, ‘Сказки Пушкина’, ‘Пушкин А.С.’, ‘’, 2010, 316)
Мы можем не вводить соавтора, так как он отсутствует для данного издания. В этом случае мы должны задать список вводимых столбцов:
INSERT INTO BOOKS (ISBN, TITLE, AUTOR, YEARIZD, PAGES)VALUES (‘3-77777-444-2’, ‘Сказки Пушкина’, ‘Пушкин А.С.’, 2010, 316)
Столбцу COAUTOR будет присвоено в этом случае значение NULL.
Если столбец (атрибут) имеет признак обязательный (NOT NULL) при описании таблицы, то оператор INSERT должен содержать данные для ввода в каждую строку данного столбца.
В набор значений могут быть включены специальные функции и выражения. Ограничением здесь является то, что значения этих функций должны быть определены на момент ввода данных. Например, можно создать оператор ввода данных в таблицу EXEMPLAR следующим образом:
INSERT INTO EXEMPLAR (INV, ISBN, YES_NO, NUM_READER, DATE_IN, DATE_OUT) VALUES (1872, ‘5-88782-290-2’, NO, 344, GetDate(), DateAdd(d, GetDate(), 14))Дату выдачи книги задается функцией GetDate(), а дата возврата – функцией DateAdd (), которая позволяет к текущей дате (GetDate()) добавить заданное количество интервалов даты (например, 14 дней) и тем самым получить новое значение типа "дата".
Оператор INSERT позволяет ввести сразу множество строк, если их можно выбрать из некоторой другой таблицы. Допустим, что у нас есть таблица со студентами и в ней указаны основные данные о студентах: их фамилии, адреса, домашние телефоны и даты рождения. Тогда мы можем сделать всех студентов читателями нашей библиотеки одним оператором INSERT:
INSERT INTO READER (NAME_READER, ADRESS, PHONE, BIRTH_DAY)SELECT (NAME_STUDENT, ADRESS, PHONE, BIRTH_DAY) FROM STUDENT
Оператор удаления данных DELETE позволяет удалить одну или несколько строк из таблицы в соответствии с условиями, которые задаются для удаляемых строк.
Синтаксис оператора DELETE следующий:
DELETE FROM имя_таблицы [WHERE условия_отбора]Если условия отбора не задаются, то из таблицы удаляются все строки.
DELETE FROM R1Условия отбора в части WHERE имеют тот же вид, что и условия фильтрации в операторе SELECT, т.е. определяют, какие строки из таблицы будут удалены. Например, если мы исключим студента Иванова И.И. (БД «Сессия»), то мы должны написать следующую команду:
DELETE FROM R2 WHERE ФИО = ' Иванов И.И.'В части WHERE может находиться вложенный запрос. Например, если нам надо исключить неуспевающих (две и более задолженности по последней сессии):
DELETE FROM R2 WHERE R2.ФИО IN (SELECT R1.ФИО FROM R1 WHERE Оценка = 2 OR Оценка IS NULL GROUP BY R1.ФИО HAVING COUNT(*) >= 2)Однако при выполнении операции DELETE, включающей вложенный подзапрос, в подзапросе нельзя указывать таблицу, из которой удаляются строки!!!
Все операции манипулирования данными связаны с понятием целостности базы данных (будет рассматриваться далее). Поэтому операции манипулирования данными не всегда выполнимы, даже если синтаксически они написаны правильно. Например, если мы бы захотели удалить какую-нибудь группу из отношения R3, то СУБД не позволила бы нам это сделать, так как в отношениях R1 и R2 есть строки, связанные с удаляемой строкой в отношении R3 по ключам.
Операция обновления данных UPDATE требуется тогда, когда необходимо изменить данные в БД.
UPDATE имя_таблицыSET имя_столбца = новое_значение [WHERE условие_отбора]WHERE является необязательной, она позволяет отобрать строки, к которым будет применена операция модификации. Если условие отбора не задается, то операция модификации будет применена ко всем строкам таблицы.
Например, студент Степанов С.С. пересдал экзамен по дисциплине "Базы данных" с двойки на четверку (БД «Сессия»):
UPDATE R1 SET R1.Оценка = 4WHERE R1.ФИО = ‘Степанов С.С.’ AND R1.Дисциплина = ‘Базы данных’
Часто требуется провести изменение в нескольких строках таблицы. Например, если мы добавим в БД «Сессия» таблицу R4 = <Группа, Курс>, которая содержит перечень курсов, на которых учатся студенты, то можно с помощью операции обновления промоделировать операцию перевода групп на следующий курс:
UPDATE R4 SET R4.Kypc = R4.Kypc + 1Операция модификации может использовать вложенные подзапросы. Добавим в БД «Сессия» еще одну таблицу R5 = <ФИО, Группа, Стипендия>, которая будет содержать перечень студентов, получающих стипендию. Исходно там могут находиться все студенты с указанием неопределенного размера стипендии. По мере анализа отношения R1 мы можем постепенно заменять неопределенные значения на конкретные размеры стипендии. Отношение R5 имеет вид:
Будем считать наличие всех (трех) пятерок по сессии признаком повышенной стипендии, + 50% к основной, наличие двух пятерок из сданных экзаменов и отсутствие двоек и троек на сданных экзаменах — признаком повышения стипендии на 25%, наличие хотя бы одной двойки среди сданных экзаменов — признаком снятия или отсутствия стипендии вообще, то есть –100% надбавки. В остальных случаях – обычная стипендия с надбавкой 0%. Все эти изменения мы можем сделать только отдельными операциями обновления.
Назначение повышенной стипендии с надбавкой 50%:
UPDATE R5 SET R5.Стипендия = 1.5*<число> WHERE R5.ФИО IN (SELECT R1.ФИО FROM R1 WHERE R1.Оценка = 5 GROUP BY R1.ФИО HAVING COUNT(*) = 3)Назначение стипендии с надбавкой 25%:
UPDATE R5 SET R5.Стипендия = 1.25*<число> WHERE R5.ФИО IN (SELECT R1.ФИО FROM R1 WHERE R1.Оценка = 5 AND R1.ФИО NOT IN (SELECT A.ФИО FROM R1 A WHERE A.Оценка <= 3 OR A.Оценка IS NULL AND R1.ФИО = A.ФИО) GROUP BY R1.ФИО HAVING COUNT(*) = 2)Назначение обычной стипендии 0%:
UPDATE R5 SET R5.Стипендия = <число> WHERE R5.ФИО IN (SELECT R1.ФИО FROM R1 WHERE R1.Оценка > 3 AND R1.ФИО NOT IN (SELECT A.ФИО FROM R1 A WHERE A.Оценка <= 2 OR A.Оценка IS NULL))Снятие стипендии -100%:
UPDATE R5 SET R5.Стипендия = 0 WHERE R5.ФИО IN (SELECT R1.ФИО FROM R1 WHERE R1.Оценка <= 3 OR R1.Оценка IS NULL)Пример универсального запроса определения отличников (независимо от количества экзаменов):