Добавление информации в базу данных.
Все записи в SQL вводятся с использованием команды модификации INSERT. В самой простой форме эта команда имеет следующий синтаксис:
INSERT INTO < имя таблицы >
VALUES (< value>, < value>…);
INSERT INTO TEACHERS
VALUES ( 4006, «Федченко», «Светлана», «Геннадиевна», 01/09/1999);
INSERT не производит никакого вывода. Если требуется ввести в таблицу NULL значение, то оно вводится точно так же, как и обычное.
INSERT INTO TEACHERS
VALUES ( NULL, «Федченко», «Светлана», «Геннадиевна», 01/09/1999
Также допускается указывать столбцы, куда необходимо осуществить вставку значения, что позволяет делать это в любом порядке.
INSERT INTO TEACHERS (TDATE, TFAM, TIMA)
VALUES ( 01/09/1999, «Федченко», «Светлана»);
Можно использовать команду INSERT для того чтобы получать или выбирать значения из одной таблицы и помещать их в другую вместе с запросом. Для этого предложение VALUES заменяется на соответствующий запрос:
Пример 1. Пусть имеется таблица EXCELLENT. Добавить в неё строки из таблицы USP, в которых оценка равна 5.
INSERT INTO EXCELLENT
|
|
SELECT *
FROM USP
WHERE OCENKA = 5;
Таблица EXCELLENT
EXCELLENT | ||||
UNUM | OCENKA | UDATE | SNUM | PNUM |
10/06/1999 | ||||
12/06/1999 |
Таким образом, будет получена независимая таблица с некоторыми данными из таблицы успеваемости USP. При изменении значений в таблице USP это ни в коем случае не отразится на таблице EXCELLENT.
Пример 2. В поле SNUM, AVGOCENKA таблицы AVGRAITING вставить значения полей SNUM, OCENKA таблицы USP, расположив их в порядке возрастания.
INSERT INTO AVGRAITING (SNUM, AVGOCENKA)
SELECT SNUM, AVG ( OCENKA)
FROM USP
GROUP BY SNUM;
Обратите внимание на то, что указаны имена столбцов таблицы AVGRAITING, а значит, последовательность данных во вставляемом списке (т.е. порядок следования полей в предложении SELECT) должна с этимпорядком совпадать.
В INSERT можно использовать подзапросы внутри любого запроса, который генерирует значения для этой команды.
Пример 3. В таблицу STO вставить фамилии, имена и отчества студентов, у которых есть хотя бы одна отличная оценка.
INSERT INTO STO (SFAM, SIMA, SOTCH)
SELECT SFAM, SIMA, SOTCH
FROM STUDENTS
WHERE SNUM = ANY
(SELECT SNUM
FROM USP
WHERE OCENKA = 5);
Подзапрос находит все строки для студентов, имеющих отличные оценки, и формирует набор значений SNUM. Внешний запрос выбирает строки из таблицы STUDENTS, где эти значения SNUM найдены, а INSERT вставляет найденные данные в таблицу STO.
В команде INSERT допускается использовать соотнесенные подзапросы. Предположим, что имеется таблица MAXOOCEN, в которой хранится информация о студенте, имеющем максимальную оценку за определенную дату (скажем, для начисления именной стипендии). Тогда, для отслеживания изменения данных в таблице успеваемости и модификации соответствующей информации о претенденте на именную стипендию, необходимо воспользоваться следующей командой с соотнесенным подзапросом:
|
|
INSERT INTO MAXOCENKA (SNUM, OCENKA)
SELECT SNUM, OCENKA
FROM USP FIRST
WHERE OCENKA=
(SELECT MAX ( OCENKA)
FROM USP SECOND = SECOND.UDATE);
При этом рассматриваемая команда имеет подзапас, который базируется на той же самой таблице, что и внешний запрос, но не ссылается на таблицу MAXOCENKA, на которую воздействует команда, поэтому такая конструкция является допустимой.
9.2. Удаление данных. Удаление строк из таблицы можно осуще
Пример 2. Удалить информацию о студентах из таблицы STUDENTS, причём таких, у которых имеются тройки по любому из учебных предметов.
DELETE FROM STUDENTS
WHERE SNUM
(SELECT SNUM
FROM USP
WHERE OCENKA = 3);
В данном случае подзапрос выберет всех студентов, имеющих тройки и таблицы успеваемости, и в предикат основной команды вернёт номера их студенческих билетов.
Допускается в предикате команды DELETE использовать подзапросы. Кроме того, очень эффективно выполнять сначала вторичные действия (проверки и т.п.) после чего выполнять само удаление. Хотя нельзя ссылаться на таблицу, из которой будут удаляться записи, в предложении FROM подзапроса, в предикате допускается ссылка на текущую строку этой таблицы, т.е. можно использовать соотнесенные подзапросы. Например:
DELETE FROM STUDENTS