- •Шехтман в. Е.
- •1. Базы данных и модели данных
- •1.1. Введение.
- •1.2. Файлы операционной системы
- •1.3. Пример базы данных.
- •1.4. Иерархическая модель данных
- •1.5. Сетевая модель данных
- •1.6. Инвертированные списки.
- •2. Введение в реляционную модель данных.
- •1.7. Реляционная модель данных
- •3. Реляционная алгебра
- •3.1. Теоретико-множественные операции.
- •3.2. Специальные операции ra
- •4. Нормализация данных
- •4.1. Полная декомпозиция.
- •Магазин товар ндс
- •Товар ндс
- •Магазин ндс
- •Товар ндс
- •Магазин товар ндс
- •4.2. Проблема дублирования данных.
- •1 Глобус 33-33-33
- •2 Глобус 33-33-33
- •4 Океан 77-77-77
- •4.3. Висячие записи.
- •Поставщик Тел
- •4.4. Проблемы, возникающие из-за неудачной структуры данных.
- •4.5. Пятая нормальная форма (5нф).
- •4.6. Функциональная зависимость.
- •4.7. Связь между фз и полной декомпозицией отношения.
- •4.8. Первая нормальная форма (1нф).
- •4.9. Вторая нормальная форма (2нф).
- •4.10. Третья нормальная форма (3нф).
- •4.11. Нормальная форма Бойса-Кодда (нфбк).
- •4.12. Многозначная зависимость.
- •4.13. Четвертая нормальная форма (4нф).
- •4.14. Пример нормализации.
- •4.15. Резюме. Нормальные формы.
- •5. Инфологическое моделирование.
- •5.1. Сущность и набор сущностей
- •5.2. Связи между сущностями.
- •5.3. Рекурсивная связь. Роли.
- •5.4. Множественные связи.
- •5.5. Суперсущности и производные сущности
- •5.6. Слабые наборы сущностей
- •5.7. Борьба с избыточнотью
- •5.8. Преобразование инфологической модели в физическую модель.
- •5.9. Пример инфологического моделирования.
- •6. Язык sql
- •6.1. История sql.
- •6.2. Структура sql.
- •6.3. Язык запросов
- •6.4. Простые запросы на выборку данных.
- •6.5. Агрегатные (групповые) функции.
- •6.6. Вложенные запросы
- •6.7. Внешние объединения
- •6.8. Изменение данных
- •Insert into r1 (o, fio, d) values (5, ‘Иванов’, ’бд’)
- •7. Представления.
- •8. Определение схемы базы данных и ограничений целостности
- •9. Транзакции
- •9.1. Свойства транзакций
- •9.2. Надежное хранение данных
- •9.3. Параллельное выполнение транзакций
- •9.3.1. Коллизия “пропавшие изменения” - lost update problem
- •9.3.2. Коллизия “промежуточные данные” - dirty read
- •9.3.3. Коллизия “Несогласованные данные” - unrepeatable read, inconsistent analysis
- •9.3.4. Коллизия “фантом” - phantom
- •9.4. Уровни изолированности
- •9.5. Тупики
- •10. Ограничение прав доступа в целях обеспечения безопасности
- •11. Физическая организация баз данных
- •11.1. Организация размещения данных.
- •11.2. Организация индексов
- •11.2.1. Поиск в бд.
- •11.2.2. Плотный индекс (индексно-прямые файлы).
- •11.2.3. Неплотный индекс (индексно-последовательные файлы).
- •11.2.4. Сбалансированные деревья.
- •11.2.5. Инвертированные списки.
- •12. Архитектура субд. Методы оптимизации запросов.
- •Логические преобразования запросов.
- •Преобразования запросов с изменением порядка реляционных операций.
- •13. Аналитические системы.
- •Анализ данных.
- •Хранилища данных
- •Типы ошибок
- •Способы реализации olap.
- •Требования к средствам реализации систем оперативной и аналитической обработки данных
- •Многомерная модель данных.
- •Разработка данных
- •14. Загружаемые процедуры.
- •In pr double precision)
- •If eof then leave Cl end if;
- •Insert into providers(code, name)
- •Values (nr.Codec, ‘*** новый поставщик ***’);
- •15.4. Модель сервера приложений (трёхзвенная архитектура, “тонкий клиент”)
- •Список литературы
- •15. Модели совместного доступа к бд
- •15.1. Файл-серверная модель.
- •15.2. Модель клиент-сервер с бизнес-логикой на клиенте.
- •15.3. Модель клиент-сервер с бизнес-логикой на сервере субд (хранимые процедуры и триггеры) и частично на клиенте.
6.8. Изменение данных
Операторы изменения данных не возвращают результат, как это делает оператор запроса на выборку SELECT, но вместо этого они изменяют содержимое таблиц базы данных.
Имеется 3 вида изменений:
вставка стороки или нескольких строк
удаление стороки или нескольких строк
изменение значений полей стороки или нескольких строк
Общий вид оператора вставки:
INSERT INTO имя таблицы [ (<список столбцов>) ] VALUES (<список значений>)
(<список столбцов>) необязателен, если VALUES задает все столбцы в порядке их следования в таблице.
INSERT INTO имя таблицы [ (<список столбцов>) ]
SELECT (<список столбцов>) FROM имя таблицы …
Общий вид оператора удаления:
DELETE FROM имя таблицы [WHERE условия отбора]
Общий вид оператора изменения значений полей:
UPDATE имя таблицы SET имя столбца = новое значение [, имя столбца = новое значение] [, имя столбца = новое значение] … [WHERE условие отбора]
1. Записать факт получения оценки 5 студентом Ивановым на экзамене по курсу ‘Базы данных’:
Insert into r1 (o, fio, d) values (5, ‘Иванов’, ’бд’)
Для иллюстрации использования операторов модификации введем в рассмотренную ранее базу данных о студентах еще 2 отношения:
R4 = (G, K), где G – группа, K – курс.
R5 = (FIO, G, S, STIPENDIA), где FIO – имя студента, G – группа, S - % повышения стипендии по результатам сессии, STIPENDIA – величина стипендии в рублях.
2. Перевести все группы в ВУЗе на следующий курс:
UPDATE R4 SET R4.K = R4.K +1
3. Если количество пятерок равно 3 (примем, что всего надо сдать 3 экзамена - т. е. рассматриваем случай круглого отличника), то назначить повышенную стипендию (S = 50%):
UPDATE R5 SET R5.S = 50 WHERE R5.FIO IN
(SELECT R1.FIO FROM R1 WHERE R1.O = 5
GROUP BY R1.FIO HAVING COUNT(*)=3)
Здесь и далее использован оператор IN, который принимает значение TRUE только если кортеж совпадает хотя бы с одним кортежем из подзапроса.
4. Если количество пятерок равно 2 и нет двоек и троек (2 пятерки и 1 четверка), то S = 25%:
UPDATE R5 SET R5.S = 25 WHERE R5.FIO IN
(SELECT R1.FIO FROM R1 WHERE R1.O = 5 AND
R1.FIO NOT IN
(SELECT A.FIO FROM R1 A WHERE A.O <=3 OR A.O IS NULL)
GROUP BY R1.FIO HAVING COUNT(*)=2)
5. Если нет 3 и количество оценок 4 больше 1, то обычная стипендия:
UPDATE R5 SET R5.S = 0 WHERE R5.FIO IN
(SELECT R1.FIO FROM R1 WHERE R1.O=4 AND R1.FIO NOT IN
(SELECT A.FIO FROM R1 A
WHERE A.O <=3 OR A.Ocenka IS NULL)
GROUP BY R1.FIO HAVING COUNT(*)=2)
6. Если есть оценка 2, то нет стипендии:
UPDATE R5 SET R5.S = -100 WHERE R5.FIO IN
(SELECT R1.FIO FROM R1 WHERE R1.O <= 2 OR R1.O IS NULL)
7. Представления.
Представление (VIEW) – это не физическая, а “виртуальная” таблица, определенная путем ссылки на таблицы и другие представления. Синтакси определения представления:
<представление> ::= CREATE VIEW <имя представления> [( список столбцов)]
AS <SQL-запрос>
Пример представления (так называемое, горизонтальное представление):
CREATE VIEW PMI99 AS
SELECT * FROM R5 WHERE G = ‘ПМИ99’
Другой пример (так называемое, вертикальное представление):
CREATE VIEW PURCHASERS AS
SELECT DISTINCT NAME FROM PURCHASERS
Представление может быть образовано путем применения операции группировки (так называемое, сгруппированное):
CREATE VIEW STIP (G, CNT, SM, MX, MN, AG)
AS
SELECT G, COUNT(*), SUM(STIPENDIA), MAX(STIPENDIA), MIN(STIPENDIA), AVG(STIPENDIA)
FROM R5 GROUP BY G
Можно задать представление на основе соединения таблиц (так называемое, соединенное):
CREATE VIEW POSTAVKI AS
SELECT S.WEIGHT, S.PRICE, S.DAT, P.NAME, G.NAME, P.CODE, G.CODE
FROM SUPPLIES AS S
LEFT JOIN PROVIDERS AS P ON S.CODEC = P.CODE
LEFT JOIN GOODS AS G ON S.CODEG = G.CODE
Доступ к данным представления можно получить тем же способом, что и к данным обычной таблицы:
SELECT * FROM PMI99 ORDER BY S, FIO
Иногда можно изменять данные в представлении (т. е. изменять данные в соответствующих таблицах, лежащих в основе представления). Согласно стандарту SQL89, например, это возможно при следующих условиях:
в SQL-запросе не используется ключевое слово DISTINCT
раздел FROM запроса содержит только 1 таблицу
столбцы не являются выражениями и не основаны на применении агрегатных функций
WHERE не содержит вложенный подзапрос
не используются ключевые слова GROUP BY или HAVING
