Операторы манипулирования данными
В операции манипулирования данными входят три оператора: удаления записей — 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)Пример универсального запроса определения отличников (независимо от количества экзаменов): UPDATE R5SET R5.Стипендия = 50% WHERE R5.ФИО IN (SELECT R1.ФИО FROM R1, R2 -- определение группы WHERE R1.ФИО = R2.ФИО AND R1.Оценка = 5 -- для отличников GROUP BY R1.ФИО HAVING COUNT(*) = (SELECT COUNT(*) FROM R3 -- кол-во экзаменов WHERE R2.Группа = R3.Группа GROUP BY R3.Группа)) -- для студента в группе
Популярное: Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... ©2015-2020 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (1043)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |