Изменить название блюда с кодом БЛ=5 на Форшмак, увеличить его выход на 30 г и установить NULL-значение в столбец Труд.
UPDATE Блюда
SET Блюдо = "Форшмак", Выход = (Выход+30), Труд = NULL
WHERE БЛ = 5;
Обновление множества записей
Утроить цену всех продуктов таблицы поставки (кроме цены кофе - ПР = 17).
UPDATE Поставки
SET Цена = Цена * 3
WHERE ПР <> 17;
Примечание. Значения команда UPDATE присваивает слева направо. Например, следующая команда удваивает столбец Выход, затем инкрементирует его:
UPDATE Блюда
SET Выход=Выход*2, Выход=Выход+1;
Если столбец устанавливается в его текущее значение, то MySQL замечает это и не обновляет его.
Обновление множества таблиц
UPDATE items, month
SET items.price=month.price
WHERE items.id=month.id;
Обратите внимание: нельзя использовать ORDER BY или LIMIT для многотабличных обновлений.
Ограничения в предложениях модификации
Для тех, кто достаточно хорошо понял предложение SELECT, несложно овладеть конструированием предложений INSERT и UPDATE. Но в процессе такого конструирования следует учитывать следующее.
В подзапросе предложения INSERT не должна упоминаться таблица, в которую загружаются данные.
Так, SQL отвергнет предложение
INSERT
INTO Выбрано
SELECT Т, БЛ
FROM Выбрано
WHERE СМ = 17;
позволяющее ввести информацию о том, что отдыхающий, сидящий на 33-м месте, выбирает тот же набор блюд, что и отдыхающий, сидящий на 17-м месте.
Составляя предложения модификации данных, необходимо все время помнить о сохранении непротиворечивости базы данных.
Вложенные подзапросы.
Во многих случаях можно переписать запрос, чтобы не использовать вложенный подзапрос. Например, запрос:
|
SELECT *
FROM R1
WHERE d1 IN
(SELECT d1 FROM R2);
можно переписать следующим образом:
SELECT R1.*
FROM R1, R2
WHERE R1.d1=R2.d1;
SELECT R1.*
FROM R1
INNER JOIN R2
ON R1.d1=R2.d1;
Почему это плохо?
Второй запрос называется естественным соединением таблиц.
Чтобы это понять необходимо вспомнить такие понятия как декартово произведение таблиц и естественное соединение таблиц.
Декартово произведение выполняется над двумя таблицами R1,R2, которые в общем случае имеют разный состав атрибутов: (d1, d2,.,dN) и (p1, p2,.., pM). В результате операции образуется новая таблица RD = R1 × R2, которая включает все атрибуты исходных таблиц (d1, d2,.., dN, p1, p2,... рM). Результирующая таблица состоит из всех возможных сочетаний строк исходных таблиц R1 и R2. Число строк декартова произведения равно произведению количества строк в исходных таблицах.
Пример.
Таблица R1:
d1 | d2 |
d11 | d21 |
d12 | d22 |
Таблица R2:
d1 | d3 | d4 |
d11 | d31 | d41 |
d12a | d32 | d41 |
d13a | d33 | d43 |
Таблица RD:
R1.d1 | d2 | R2.d1 | d3 | d4 |
d11 | d21 | d11 | d31 | d41 |
d11 | d21 | d12a | d32 | d41 |
d11 | d21 | d13a | d33 | d43 |
d12 | d22 | d11 | d31 | d41 |
d12 | d22 | d12a | d32 | d41 |
d12 | d22 | d13a | d33 | d43 |
Естественное соединение - операция, связывающая таблицы, когда общие столбцы имеют равные значения. Общее определение естественного соединения таково: предположим, что мы хотим взять естественное соединение двух таблиц R1 и R2, имеющих такие общий столбец p, по которыму производится естественное соединение. Тогда операция выполняется за следующих три шага:
1. Берется декартово произведение таблиц R1 и R2. В результате получается таблица, содержащая два столбца p.
В нашем примере это столбцы d1.
|
2. Из таблицы декартова произведения исключаются все строки, кроме тех, в которых значения столбцов d1 из таблицы R1 равны значениям этих же столбцов в R2
Получим:
R1.d1 | d2 | R2.d1 | d3 | d4 |
d11 | d21 | d11 | d31 | d41 |
3. Проектированием исключается одна копия столбцов d1.
Получим:
d1 | d2 | d3 | d4 |
d11 | d21 | d31 | d41 |
Если таблица R1 имеет к столбцов, а таблица R2 имеет m столбцов, то естественное соединение таблиц R1 и R2 будет состоять из (k+m-1) столбцов.
Далее в нашем примере мы должны оставить только столбцы из таблицы R1:
d1 | d2 |
d11 | d21 |
Т.о. налицо большая избыточность в вычислениях. Зато первый запрос выполняется намного проще:
Вначале выполняется внутренний запрос:
SELECT d1 FROM R2
Получим:
d1 |
d11 |
d12a |
d13a |
Затем выполняется запрос
SELECT *
FROM R1
WHERE d1 IN (d11, d12a, d13a);
Очевидно, что при этом из таблицы R1 выбирается одна строка (первая) и мы сразу получаем нужный результат.
Таблицы MySQL
Здесь мы рассмотрим вопросы создания таблиц в MySQL
Создание базовых таблиц
Базовые таблицы описываются в SQL с помощью предложения CREATE TABLE (создать таблицу), синтаксис которого имеет небольшие различия в различных СУБД. Однако все они поддерживают следующую минимальную форму:
CREATE TABLE таблица (столбец тип_данных [NOT NULL]
[,столбец тип_данных [NOT NULL]]...);
Так, описание таблицы Блюда может быть записано в виде
CREATE TABLE Блюда
(БЛ INT NOT NULL,
Блюдо CHAR (70) NOT NULL,
В CHAR (1),
О INT,
Выход FLOAT,
Труд INT DEFAULT 100,
PRIMARY KEY(БЛ),
CONSTRAINT CHECK БЛ > 10);
Конструкция NOT NULL запрещает использование неопределенного значения.
|
Но нам то требуется задать первичные ключи, внешние ключи, определить стратегии поддержания ссылочной целостности данных, иногда задать просто список возможных значений для отдельных полей. Т.е. в общем случае синтаксис предложения CREATE TABLE намного более сложный.
Подробности в лаб. работе № 4.