Мегаобучалка Главная | О нас | Обратная связь

Операторы манипулирования данными





В операции манипулирования данными входят три оператора: удаления записей — DELETE, добавления новых записей — INSERT и изменения (обновления записей) — UPDATE. Все операторы манипулирования данными позволяют изменить данные только в одной таблице.

Оператор ввода данных INSERT имеет следующий синтаксис:

INSERT INTO имя_таблицы [(<список столбцов>) ] VALUES (<список значений>)

В общем случае можно ввести только одну строку в таблицу. Задание списка столбцов необязательно тогда, когда мы вводим строку с заданием значений всех столбцов таблицы. Например, введем новую книгу в таблицу BOOKS (БД «Библиотека»):

INSERT INTO BOOKS
VALUES (‘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.Оценка = 4
WHERE 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)

Пример универсального запроса определения отличников (независимо от количества экзаменов):





Читайте также:


Рекомендуемые страницы:


Читайте также:
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...

©2015-2020 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (627)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.004 сек.)