Обновление единственной записи




Изменить название блюда с кодом БЛ=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.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-14 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: