Лекция № 8
Тема: "Запросы на изменение данных"
План
1. Запросы на изменение данных
2. Запросы на добавление записей в таблицу
3. Запросы на обновление данных в таблице
4. Запросы на удаление данных из таблицы
5. Запросы на создание таблицы
1. Запросы на изменение данных
Важное значение для решения различных информационных задач по работе с БД имеют запросы на изменение данных. Такие запросы вносят изменения сразу в группу записей за одну операцию. Таким образом, результатом запросов на изменение является не набор данных, как в запросах на выборку, а изменение данных в самих таблицах.
Запросы на изменение данных широко применяются для ввода данных при импорте из внешних источников, перемещения записей или их элементов из одних таблиц в другие таблицы, при массовой однотипной коррекции или чистке данных, а также для архивации и экспорта данных.
Существует четыре разновидности запросов на изменение:
• запросы на добавление;
• запросы на обновление;
• запросы на удаление;
• запросы на создание таблицы.
2. Запросы на добавление записей в таблицу
Данный тип запроса позволяет добавить в таблицу новую запись и заполнить ее поля указанными значениями.Для добавления новой записи в таблицу используют команду вида:
Insert
Into имя_таблицы(список полей)
Values(список значений)
Список полей и список значений – это перечень значений через запятую. При этом важно, чтобы очередность и типы соответствующих элементов в этих списках совпадали.
Пример. Добавим в таблицу students новую запись.
Insert
Into students (id_stud, fam, imya, otch, datar, pol, finance)
Values (123, 'Иванов', 'Иван', 'Иванович', '1995-02-15', 'м', 'Госзаказ')
В данном примере мы ключевому полю явно указали числовое значение. Это допустимо, если ключевое поле не является счетчиком. В этом случае пользователь должен ввести такое значение ключа, которого еще нет в таблице, иначе при повторнеии значения будет выдаваться ошибка.
Если ключевое поле является счетчиком, то мы не можем явно задавать для него новое значение и должны позволить сделать это самой СУБД . В этом случае полю-счетчику целесообразно присваивать значение NULL, а СУБД сама запишем подходящее значение.
Insert
Into students (id_stud, fam, imya, otch, datar, pol, finance)
Values (null, 'Иванов', 'Иван', 'Иванович', '1995-02-15', 'м', 'Госзаказ')
Если в списке Values задаются значений для всех полей таблицы без исключения и в порядке их физического следования, то список полей можно не указывать.
Insert
Into students
Values (null, 'Иванов', 'Иван', 'Иванович', '1995-02-15', 'м', 'Госзаказ')
Если в таблице имеются поля с ограничением NULL (не обязательны для заполнения) или поля со значениями по умолчанию (default), или поле-счетчик, то такие поля можно не заполнять.
Предположим, что поле id_stud - это счетчик, поле datar не обязательное для заполнения, поле pol имеет значение по умолчанию 'м', поле finance имеет значение по умолчанию 'Бюджет'. Добавим новую запись, не заполняя перечисленные поля.
Insert
Into students (fam, imya, otch)
Values ('Иванов', 'Иван', 'Иванович')
3. Запросы на обновление данных в таблице
Запрос на обновление позволяет изменить значения заданных полей таблицы. При этом можно изменить как все записи, так и записи, удовлетворяющиеся некоторому условию.
Для обновления данных используют команду вида:
Update имя_таблицы
Set поле=новое_значение, поле=новое_значение . . .
[Where условия]
Пример. В таблице Ocenki все оценки по Физике увеличить на 2.
Update ocenki
Set ocenka=ocenka+2
Where predmet='Физика'
Обновление данных в связанных таблицах
В запросах на изменении данных допускается использовать связанные таблицы. В этом случае команда запроса для разных СУБД имет разный вид.
SQL Server
В данной СУБД запрос на обновление имеет вид:
update таблица
set поле = новое значение
from список связанных таблиц
[Where условия]
Пример. В таблице Ocenki все оценки по Физике для группы 38 увеличить на 2. Запрос обращается к 3-м таблицам: grupy, students, ocenki.
update Ocenki
set ocenka = ocenka + 2
from grupy inner join students on grupy.id_grup=students.id_grup
inner join ocenki on students.id_stud=ocenki.id_stud
Where grupa like '38%'
and predmet='Физика'
MySQL
В данной СУБД запрос на обновление имеет вид:
update список_таблиц_через_запятую
set поле = новое значение
where условие для связи таблиц
[and дополнительны условия]
Пример. В таблице Ocenki все оценки по Физике для группы 38 увеличить на 2. Запрос обращается к 3-м таблицам: grupy, students, ocenki.
update grupy, students, ocenki
set ocenka = ocenka+2
where grupy.id_grup=students.id_grup and students.id_stud=ocenki.id_stud
and grupa like '38%' and predmet='Физика'
Microsoft Access
В данной СУБД запрос на обновление имеет вид:
Update список_связанных_таблиц
Set поле=новое_значение, поле=новое_значение . . .
[Where условия]
Пример. В таблице Ocenki все оценки по Физике для группы 38 увеличить на 2. Запрос обращается к 3-м таблицам: grupy, students, ocenki.
Update grupy inner join students
on grupy.id_grup=students.id_grup
inner join ocenki
on students.id_stud=ocenki.id_stud
Set ocenka=ocenka+2
Where grupa like '38%'
and predmet='Физика'
Замечание. Использование запроса на изменение данных требует от пользователя повышенного внимания. В случае его неправильного или невнимательного применения можно безвозвратно изменить огромные массивы информации в таблицах. Поэтому, перед ее использование рекомендуется создавать резервные копии оригинальных таблиц (см .ниже).
4. Запросы на удаление данных из таблицы
Запрос на удаление позволяет удалить из таблицы все записи, которые удовлетворяют условию. Если условие не задано, то таблица очищается полностью.
Как и для запрос ана обновление рекомендуется перед удалением обязательно создавать копии оригинальных таблиц.
Сама команда имеет вид:
Delete
From имя_таблицы
[Where условия]
Пример. Из таблицы ocenki удалить все оценки по Физике.
Delete
From ocenki
Where predmet='Физика'
В запросах на удаление данных допускается использовать связанные таблицы. В этом случае команда удаления записывается так:
Delete таблица_для_удаления
From список_связанных_таблиц
[Where условия]
Пример. В таблице Ocenki удалить оценки по Физике для группы 38.
Delete ocenki
From grupy inner join students
on grupy.id_grup=students.id_grup
inner join ocenki
on students.id_stud=ocenki.id_stud
Where grupa like '38%'
and predmet='Физика'
5. Запросы на создание таблицы
Запросы на создание таблицы за одну операцию создают новую таблицу с заполненными данными на основе всех или части данных из одной или нескольких таблиц. Такие запросы чаще всего решают задачи по реорганизации базы данных, архивированию или резервированию данных, а также могут применяться для создания отчетов или состояний базы данных по определенным временным промежуткам. такой запрос основан на обычном запросе выбора Select, но с указанием параметра Into. Команда для создания таблицы имеет вид:
--Для SQL Server
Select список_полей
Into новая_таблица
From исходная_таблица
[Where условия]
#Для MySQL
Create Table новая_таблица
Select список_полей
From исходная таблица
[Where условия]
Пример. Отобрать в новую таблицу с именем t1996 всех студентов, которые родились в 1996 году.
--Для SQL Server
Select *
Into t1996
From students
Where datar between '01.01.1996' and '31.12.1996'
#Для MySQL
Create Table t1996
Select *
From students
Where datar between '01.01.1996' and '31.12.1996'
Если раздел Where не указан, то создается полная копия исходной таблицы.
Пример. Пусть пользователь планирует применить к таблице students запрос на обновление данных. Необходимо выполнить резервное копирование таблицы под именем students2.
--Для SQL Server
Select *
Into students2
From students
#Для MySQL
Create table students2
Select *
From students
Допускается создание ноой таблицу на основе связанных таблиц.
Пример. Отобрать название группы, ФИО и дату рождения студентов мужского пола. Результат отбора поместить в таблицу studMen.
--Для SQL Server
Select nazv_grup, fam, imya, otch, datar
Into studMen
From grupy inner join students
on grupy.id_grup=students.id_grup
Where pol = 'м'
#Для MySQL
Create Table studMen
Select nazv_grup, fam, imya, otch, datar
From grupy inner join students
on grupy.id_grup=students.id_grup
Where pol = 'м'
Обратите внимание, что имя новой таблицы должно отсутствовать перед выполнением данного запроса. В противном случае будет выдаваться сообщение об ошибке.
Для предотвращения появления такой ошибки рекомендуется перед запросом на создание таблицы пытаться удалить ее, если она уже создана. Для этого используют команду вида:
--Для SQL Server
If OBJECT_ID('имя_таблицы', 'U') IS NOT NULL
Drop Table имя_таблицы
#Для MySQL
Drop Table If Exists имя_таблицы
Пример. Пусть необходимо выполнить резервирование таблицы students под именем students2. При этом о наличии таблицы students2 в базе заранее неизвестно.
--вначале удаляем таблицу, если она существует
If OBJECT_ID('students2', 'U') IS NOT NULL
Drop Table students2
--создаем резервную копию таблицы students
Select *
Into students2
From students
Пример. Запишем предыдущий пример для MySQL.
--вначале удаляем таблицу, если она существует
Drop Table If Exists students2
--создаем резервную копию таблицы students
Select *
Into students2
From students
Вопросы для самоконтроля
1. Для чего используются запросы на изменение данных? Какие типы таких запросов вы знаете?
2. Опишите запрос на добавление данных в таблицу. Как задать значение для поля счетчика?
3. Опишите запрос на обновление данных. Как в запросе указать связанные таблицы? Пример.
4. Опишите запрос на удаление данных. Как в запросе укаазать связанные таблицы?
5. Опишите запрос на создание таблицы в SQL Server. Как удалить существующую таблицу, если она существует?
6. Опишите запрос на создание таблицы в MySQL. Как удалить существующую таблицу, если она существует?