Предположим, что в таблице Книги (Название, Цена) столбец Цена имеет значение NULL, если соответствующей книги нет в наличии. Следующий запрос возвращает таблицу, в которой вместо NULL отображается текст "Нет в наличии":
SELECT Название, COALESCE (CAST(Цена AS CHAR(8)),
'Нет в наличии') AS Цена
FROM Книги;
Добавление, удаление и изменение данных в таблицах
Запросы, рассмотренные в предыдущих главах, были направлены на то, чтобы получить данные, содержащиеся в существующих таблицах базы данных. Главным ключевым словом таких запросов на выборку данных является select. Запросы на выборку данных всегда возвращают виртуальную таблицу, которая отсутствует в БД и создается временно лишь для того, чтобы представить выбранные данные пользователю.
При создании и дальнейшем сопровождении БД обычно возникает задача добавления новых и удаления ненужных записей, а также изменения содержимого ячеек таблицы. В SQL для этого предусмотрены операторы insert (вставить), delete (удалить) и update (изменить). Запросы, начинающиеся с этих ключевых слов, не возвращают данные в виде виртуальной таблицы, а изменяют содержимое уже существующих таблиц БД. Запросы на модификацию (добавление, удаление и изменение) данных могут содержать вложенные запросы на выборку данных из той же самой таблицы или из других таблиц, однако сами не могут быть вложены в другие запросы. Таким образом, операторы insert, delete и update в SQL-выражении могут находиться только в самом начале.
Когда создается таблица базы данных, она не содержит никаких записей, т. е. является пустой. Чтобы наполнить таблицу данными, необходимо добавить (вставить) в нее хотя бы одну запись. Дня этого служит оператор insert(вставить), который имеет несколько форм:
insert into имяТаблицы values (списокЗначений)
вставляет пустую запись в указанную таблицу и заполняет эту запись значениями из списка, указанного за ключевым словом values. При этом первое в списке значение вводится в первый столбец таблицы, второе значение – во второй столбец и т. д. Порядок столбцов задается при создании таблицы. Данная форма оператора insert не очень надежна, поскольку нетрудно ошибиться в порядке вводимых значений.
Более надежной и гибкой является следующая форма:
insert into имяТаблицы (списокСтолбцов) values (списокЗначений)
вставляет пустую запись в указанную таблицу и вводит в заданные столбцы значения из указанного списка. При этом в первый столбец из списокСтолбцов вводится первое значение из списокЗначений, во второй столбец – второе значение и т. д. Порядок имен столбцов в списке может отличаться от их порядка, заданного при создании таблицы. Столбцы, которые не указаны в списке, заполняются значением null. Иногда требуется просто добавить пустую запись. В этом случае первая форма оператора insertтребует после ключевого слова valuesуказать список значений null, длина которого равна количеству столбцов. В данном случае рекомендуется использовать данную форму оператора insert:
insert into имяТаблицы (имяЛюбогоСтолбца) values (null)
Следующий запрос добавляет новую запись в таблицу Клиенты,при этомвстолбцы Имя, Телефон и Сумма_заказа вводятся значения соответственно 'Петров', '444-4444' и 25300.
insert into Клиенты (Имя, Телефон, Сумма_заказа) values ('Петров', '444-4444', 25300);
Начиная с SQL-92 появилась возможность работать со значениями типа запись. Это позволяет за ключевым словом values указать несколько наборов значений в круглых скобках (записей), которые необходимо вставить в таблицу. Например:
insert into Клиенты (Имя, Телефон, Сумма_заказа)
values
('Петров', '444-4444', 25300),
('Иванов', '555-5555', 45100),
('Сидоров', '777-7777', 1200),
('Захаров', '423-9870', 7800);
Следующий формат вставляет в указанную таблицу записи, возвращаемые запросом на выборку.
insert into имяТаблицы (списокСтолбцов) select …
На практике нередко требуется загрузить в одну таблицу данные из другой таблицы. Например, ранее созданная таблица Контактысодержит имена и другие данные о клиентах, которые необходимо вставить в таблицу Клиенты.Для этого в операторе insertвместо valuesможно использовать оператор select, выбирающий записи, необходимые для вставки.
Допустим, таблицы Клиенты и Контакты имеют одноименные и однотипные столбцы Имя, Адрес и Телефон. Требуется добавить все записи из таблицы Контакты в таблицу Клиенты. Это можно сделать с помощью следующего запроса:
insert into Клиенты (Имя, Адрес, Телефон)
select Имя, Адрес, Телефон from Контакты;
Следующий запрос вставляет в таблицу клиенты только те записи из таблицы контакты, которых в ней еще нет. Таким образом, происходит дополнение первой таблицы данными из второй таблицы:
insert into Клиенты (Имя, Адрес, Телефон)
select Имя, Адрес, Телефон from Контакты
where Клиенты.Имя < > Контакты.Имя and
Клиенты.Адрес < > Контакты.Адрес and
Контакты.Имя is not null;
Здесь в операторе where применено сложное условие на случай, если в таблицах окажутся однофамильцы или в таблице Контактыокажутся неопределенные имена. С помощью оператора insertможно добавить одну или несколько записей только в одну таблицу. Кроме того, необходимо учитывать следующие обстоятельства:
ü таблица может иметь столбец типа serial (счетчик), имеющий уникальные значения, которые СУБД назначает автоматически. Это обеспечивает уникальность всех записей таблицы и, следовательно, ее соответствие 1-ой нормальной форме. Поэтому в списке столбцов в операторе insert не следует указывать столбцы типа serial;
ü если список столбцов, указанный в операторе insert, содержит не все столбцы таблицы, то в оставшиеся столбцы (за исключением столбца типа serial) будут введены значения null(неопределенное значение), а в столбец типа serialправильное числовое значение введет СУБД;
ü при введении значений в столбцы новой записи необходимо следить, чтобы типы значений соответствовали типам столбцов таблицы. При необходимости можно воспользоваться функцией преобразования типов cast ();
ü таблица может иметь ограничения и если вводимые данные не удовлетворяют условиям этих ограничений, то запрос на добавление данных не будет выполнен. Так, например, если в ограничении на какой-либо столбец указано, что он не может иметь значения null,топопытка добавить пустую запись приведет к ошибке. В этом случае необходимо использовать оператор insert intoсключевым словом values,чтобы сразу ввести значение, удовлетворяющее ограничениям.