C.11.1.Внесение изменений в базу данных 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

C.11.1.Внесение изменений в базу данных



 

При работе с SQL исключительно важно не только уметь выбирать данные, но и пользоваться средствами, которые управляют значениями в таблице. Значения могут быть помещены и удалены из полей тремя командами языка DML (Язык Манипулирования Данными), а именно:

∙ insert - вставить;

∙ update - модифицировать;

∙ delete - удалить.

Добавление информации в базу данных

Все записи в SQL вводятся с использованием команды модификации INSERT. В самой простой форме эта команда имеет -следующий синтаксис:

INSERT INTO <table name>

VALUES (<value>, <value>...);

Так, например, для добавления записи в таблицу преподавателей TEACHERS, можно воспользоваться следующим выражением:

INSERT INTO TEACHERS

VALUE S (4006, 'Федченко', 'Светлана', 'Геннадиевна', 01/09/1999);

Команда INSERT не производит никакого вывода, но желательно, чтобы СУБД давала некоторое подтверждение того, что данные были успешно внесены. Кроме того, следует помнить, что имя таблицы, в которую производится вставка, должно быть предварительно определено, а каждое значение в списке вставляемых данных должно совпадать с типом данных столбца, в который оно вставляется. Значения в этом списке вводятся в таблицу в том порядке, в котором они записаны в команде, поэтому первое значение автоматически попадает в первый столбец, второе - во второй столбец и т. д.

Если требуется ввести в таблицу NULL значение, то оно вводится точно так же, как и обычное. Например, следующая команда, вставляющая запись с неизвестным значением кода преподавателя, вполне допустима:

INSERT INTO TEACHERS

VALUES (NULL, 'Федченко', 'Светлана', 'Геннадиевна', 01/09/1999);

Так как значение NULL - специальное служебное слово, то заключать его в одиночные кавычки не требуется.

Также допускается указывать столбцы, куда необходимо осуществить вставку значения, что позволяет делать это в любом порядке. Например, команда:

INSERT INTO TEACHERS (TDATE, TFAM, TIMA) VALUES (01/09/1999, 'Федченко', 'Светлана');

позволяет вставить значения в поля таблицы в порядке TDATE, TFAM, TIMA, причем столбцы TNUM и ТОТСН отсутствуют. Это означает, что для этих полей автоматически устанавливается значение по умолчанию. Значение по умолчанию может быть введено заранее или. в противном случае, это будет NULL значение. Если ограничение запрещает использование значения NULL в данном поле, то обязательно надо позаботиться об обеспечении столбца содержательным значением для любой команды INSERT.

Можно использовать команду INSERT для того, чтобы получать или выбирать значения из одной таблицы и помещать их в другую вместе с запросом. Для этого предложение VALUES заменяется на соответствующий запрос:

INSERT INTO EXCELLENT SELECT * FROM USP WHERE OCENKA = 5;

Следовательно, будет сделано следующее: все значения, выданные запросом (информация о студентах, имеющих только отличные оценки), помещаются в таблицу, названную EXCELLENT. Для того чтобы не произошло ошибки, таблица EXCELLENT должна уже быть создана командой CREATE TABLE (о ней речь ниже) и иметь пять столбцов, которые совпадают с таблицей USP по типу данных.

Таким образом, будет получена независимая таблица с некоторыми данными из таблицы успеваемости USP. При изменении значений в таблице USP это ни в коем случае не отразится на таблице EXCELLENT.

В принципе, имеется возможность указывать столбцы по имени, как это уже было продемонстрировано выше, а значит - переупорядочивать добавляемую информацию.

Например, при помощи нижеприведенной команды можно вставить информацию о среднем балле каждого студента:

INSERT INTO AVGRAITING (SNUM, AVGOCENKA) SELECT SNUM, AVG (OCENKA.) FROM USP GROUP BY SNUM;

Обратите внимание на то, что указаны имена столбцов таблицы AVGRAITING, а значит, последовательность данных во вставляемом списке (т.е. порядок следования полей в предложении SELECT) должна с этим порядком совпадать.

В INSERT можно использовать подзапросы внутри любого запроса, который генерирует значения для этой команды аналогично тому, как это уже делалось при рассмотрении соответствующего материала.

Оба запроса в этой команде функционируют так же, как если бы они не являлись частью выражения INSERT. Подзапрос находит все строки для студентов, имеющих отличные оценки, и формирует набор значений SNUM. Внешний запрос выбирает строки из таблицы STUDENTS, где эти значения SNUM найдены. a INSERT вставляет найденные данные в таблицу' STO.

В команде INSERT допускается использовать соотнесенные подзапросы. Предположим, что имеется таблица МАХОCENKA, в которой хранится информация о студенте, имеющем максимальную оценку за определенную дату (скажем, для начисления именной стипендии). Тогда, для отслеживания изменения данных в таблице успеваемости и модификации соответствующей информации о претенденте на именную стипендию, необходимо воспользоваться следующей командой с соотнесенным подзапросом:

INSERT INTO MAXOCENKA (SNUM, OCENKA) SELECT SNUM, OCENKA FROM USP FIRST WHERE OCENKA = (SELECT MAX (OCENKA) FROM USP SECOND

WHERE FIRST.UDATE = SECOND.UDATE);

При этом рассматриваемая команда имеет подзапрос, который базируется на той же самой таблице, что и внешний запрос, но не ссылается на таблицу MAXOCENKA, на которую воздействует команда, поэтому такая конструкция является допустимой.

Удаление данных

 

Удаление строк из таблицы можно осуществить командой модификации DELETE. Стоит учитывать, что она может удалять только целые записи таблицы, а не индивидуальные значения того или иного поля. По этой причине для данного оператора параметр поля является недоступным. Например, для удаления всего содержимого таблицы STUDENTS, можно воспользоваться следующим:

DELETE FROM STUDENTS;

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

DELETE FROM STUDENTS

WHERE SNUM = 3416;

Здесь в качестве предиката использован номер студенческого билета: действительно, это поле фактически является первичным ключом таблицы, что дает гарантию удаления только одной записи. Использование поля SFAM, вообще говоря, приводит к удалению нескольких записей, т.к. в таблице могла храниться информация об однофамильцах.

В команде DELETE допускается использовать предикат, выбирающий целую группу строк. Например, следующая команда удаляет из таблицы USP все данные, относящиеся к оценкам, полученным 10/06/1999:

DELETE FROM USP

WHERE UDATE = 10/06/1999;

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

DELETE FROM STUDENTS WHERE SNUM = (SELECT SNUM FROM USP

WHERE OCENKA = 3);

В данном случае подзапрос выберет всех студентов, имеющих тройки, из таблицы успеваемости, и в предикат основной команды вернет номера их студенческих билетов.

Допускается в предикате команды DELETE использовать и подзапросы, что дает возможность установить довольно сложные критерии того, какие строки будут удаляться. Кроме того, очень эффективно выполнять сначала вторичные действия (проверки и т.п.), после чего выполнять само удаление. Хотя нельзя ссылаться на таблицу, из которой будут удаляться записи, в предложении FROM подзапроса, в предикате допускается ссылка на текущую строку этой таблицы, т.е. можно использовать соотнесенные подзапросы. Например:

DELETE FROM STUDENTS WHERE EXISTS (SELECT * FROM USP

WHERE OCENKA. = 3

AND STUDENTS. SNUM = USP. SNUM);

Собственно вся команда удаляет информацию, аналогично предыдущему примеру. Обратите внимание на то, что часть предиката внутреннего запроса ссылается к таблице STUDENTS. Это означает, что весь подзапрос будет выполняться отдельно для каждой строки данной таблицы.

В целом, структура команды DELETE достаточно проста для понимания, поэтому более подробно на ней останавливаться не будем.

 



Поделиться:


Последнее изменение этой страницы: 2017-01-25; просмотров: 106; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.199.243 (0.011 с.)