- •Выборка данных
- •Оператор select
- •Выражения sql
- •Выражение from
- •Операции left join, right join
- •Операция inner join
- •Выражение in
- •Предикаты all, distinct, distinctrow, top
- •Объявление with owneraccess option
- •Выражение where
- •Операция Like
- •Операция In
- •Операция Between...And
- •Подзапрос
- •Выражение order by
- •Выражение group by
- •Выражение having
- •Оператор union
- •Оператор transform
- •Выражение procedure
- •Объявление parameters
- •Изменение данных
- •Оператор update
- •Оператор insert into
- •Оператор delete
- •Изменение структуры
- •Оператор select...Into
- •Оператор create table3
- •Выражение constraint4
- •Оператор alter table5
- •Оператор create index6
- •Оператор drop7
- •Агрегатные функции
- •Функция Count
- •Функция Avg
- •Функция Sum
- •Функции Var и VarP
- •Функции StDev и StDevP
- •Функции Min, Max
- •Функции First, Last
Изменение данных
Управление данными сводится к трем основным операциям: ввод изменение и удаление. При этом структура таблиц остается неизменной.
Оператор update
Создает запрос на обновление, изменяющий значения полей в указанной таблице согласно указанному критерию. Формат
UPDATE table SET newvalue WHERE criteria;
Оператор UPDATE имеет следующие части:
Часть |
Описание |
table |
Имя таблицы |
newvalue |
Выражение, определяющее значение, которое вносится в конкретное поле изменяемой записи |
criteria |
Выражение, определяющее какие записи должны быть изменены |
UPDATE особенно полезен при изменении большого числа записей или записей в нескольких таблицах. Позволяет изменять сразу несколько полей:
UPDATE Orders SET OrderAmount = OrderAmount * 1.1, Freight = Freight * 1.03 WHERE ShipCountry = 'UK';
– увеличивает в таблице Order все значения Amount на 10% и Freight на 3% для заказов, доставляемых в United Kingdom.
Операцию UPDATE нельзя отменить; если нужно предварительно узнать, какие записи будут изменены, используется оператор SELECT с тем же критерием отбора
Полезно иметь страховочную копию – при неправильном изменении можно восстановить старые значения.
Поскольку UPDATE не формирует результат как набор записей, в Microsoft Access нельзя непосредственно вывести результат оператора. Если нужно подтверждать каждое изменение, можно использовать команду Replace меню Edit в форме.
Следующие запросы меняют таблицы в базе Northwind (если изменения нежелательны, нужно предварительно сделать копию, отменить нельзя)
UPDATE Employees SET ReportsTo = 5 WHERE ReportsTo = 2;
– полю ReportsTo присваивается значение 5 во всех записях таблицы Employees, в которых ReportsTo было равно 2
UPDATE Products SET UnitPrice = UnitPrice * 1.1 WHERE SupplierID = 8 AND Discontinued = No;
–
цена UnitPrice
в таблице Products
увеличивается на 10% для всех товаров
поставщика №8, у которых нет скидки.
UPDATE Suppliers INNER JOIN Products ON Suppliers.SupplierID = Products.SupplierID SET UnitPrice = UnitPrice * .95 WHERE CompanyName = 'Tokyo Traders' AND Discontinued = No;
– цена UnitPrice уменьшается на 5% для всех товаров без скидки, поставляемых Tokyo Traders. Таблицы Products и Suppliers имеют отношение n:1.
Оператор insert into
Добавляет одну или несколько записей в таблицу. Формат добавления нескольких записей:
INSERT INTO target [IN externaldatabase] [(field1[, field2[, ...]])] SELECT [source.]field1[, field2[, ...] FROM tableexpression
Формат добавления одной записи:
INSERT INTO target [(field1[, field2[, ...]])] VALUES (value1[, value2[, ...])
Оператор INSERT INTO имеет следующие части:
Часть |
Описание |
target |
Имя таблицы, в которую добавляются данные |
externaldatabase |
Путь к внешней базе (см. выражение IN) |
source |
Имя таблицы/запроса, из которой берутся данные |
field1, field2 |
Имена полей, в которые добавляются данные (если следуют за target), или откуда берутся данные (если следуют за source) |
tableexpression |
Имя таблицы/таблиц, откуда берутся данные. Может быть сохраненным запросом или запросом на объединение (INNER JOIN, LEFT JOIN, RIGHT JOIN) |
value1, value2 |
Значения полей в новой записи. Список должен соответствовать списку полей. Значения разделяются запятыми, текстовые величины заключаются в апострофы. |
Для добавления одной записи в таблицу в указывается имя и значение каждого поля. Если какое-либо поле не указано, ему присваивается значение Null, запись добавляется в конец таблицы. Если список полей не указан, значения в выражении VALUES должны ссответствовать каждому полю таблицы, иначе произойдет ошибка. В окне конструктора Microsoft Access преобразует выражение VALUES в SELECT. Рузультат тот же.
При добавлении сразу нескольких записей они берутся из другой таблицы или запроса. В этом случае выражение SELECT определяет поля, которые нужно добавить. INSERT INTO должно предшествовать выражению SELECT. Чтобы посмотреть, что добавляется, нужно составить запрос на выборку с теми же условиями.
source и target могут быть запросами. Если в качестве target указан запрос, данные добавляются во все таблицы, входящие а запрос. Если target имеет первичный ключ, то в него должно обязательно вводиться уникальное значение, иначе запись не добавится и произойдет ошибка. Если target содержит поле типа AutoNumber и надо продолжать нумерацию, его не нужно включать в список полей. Оно включается только, если нужно сохранить его исходное (из source) значение. Для добавления записей в другую базу используется выражение IN.
Для создания новой таблицы вместо запроса на создание лучше использовать SELECT...INTO. INSERT INTO не влияет на таблицы источники. Использование оператора INSERT INTO эквивалентно установке свойства DestinationTable в окне свойств запроса на добавление в конструкторе запросов.
Следующие запросы меняют таблицы в базе Northwind (если изменения нежелательны, нужно предварительно сделать копию).
В следующем примере запрос добавляет все записи из таблицы NewCustomers в Customers (NewCustomers нужно сделать как копию Customers):
INSERT INTO Customers SELECT * FROM NewCustomers;
Добавление записи в таблицу Employees
INSERT INTO Employees (FirstName,LastName, Title) VALUES ('Harry', 'Washington', 'Trainee');
Следующий запрос вводит в таблицу Employees всех практикантов (Trainees), проработавших более 30 дней:
INSERT INTO Employees SELECT Trainees.* FROM Trainees WHERE HireDate < Now() - 30;
Оператор INSERT INTO можно использовать для создания резервной копии перед внесением изменений. Для следующего примера нужно скопировать таблицу Employees в EmployeeHistory (только структуру), создать запрос
INSERT INTO EmployeesHistory (FirstName, LastName, Title) VALUES (Forms!Employees!FirstName, Forms!Employees!Lastname, Forms!Employees!Title);
сохранив его под именем BackUpQuery, затем открыть форму Employees в режиме редактирования ввести процедуру обработки события BeforeUpdate:
DoCmd.OpenQuery "BackUpQuery"
Теперь таблица будет копироваться перед каждым изменением.
