- •Шехтман в. Е.
- •1. Базы данных и модели данных
- •1.1. Введение.
- •1.2. Файлы операционной системы
- •1.3. Пример базы данных.
- •1.4. Иерархическая модель данных
- •1.5. Сетевая модель данных
- •1.6. Инвертированные списки.
- •1.7. Реляционная модель данных
- •2. Введение в реляционную модель данных.
- •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. Модели совместного доступа к бд
- •15.1. Файл-серверная модель.
- •15.2. Модель клиент-сервер с бизнес-логикой на клиенте.
- •15.3. Модель клиент-сервер с бизнес-логикой на сервере субд (хранимые процедуры и триггеры) и частично на клиенте.
- •15.4. Модель сервера приложений (трёхзвенная архитектура, “тонкий клиент”)
- •Список литературы
6.6. Вложенные запросы
Можно вкладывать запросы друг в друга. Внутренний запрос генерирует значение, которое проверяется в предикате внешнего запроса (WHERE, HAVING). Для организации вложенных запросов можно применять синонимы.
1. Список тех, кто сдал все положенные экзамены:
SELECT a.FIO FROM R1 a
WHERE a.O>2
GROUP BY a.FIO
HAVING COUNT(*) =
(SELECT COUNT(*) FROM R2, R3
WHERE R2.G = R3.G AND R2.FIO = a.FIO)
Вложенный запрос – количество экзаменов, которое надо сдать. Оно сравнивается с фактическим количеством сданных экзаменов.
Можно применять оператор EXISTS, который принимает значение TRUE только если результат вложенного запроса не пуст:
2. Список тех, кто должен сдавать экзамен по ‘Базам Данных’, но еще не сдавал:
SELECT FIO FROM R2 a, R3 WHERE R2.G = R3.G AND D = 'БД '
AND NOT EXISTS
(SELECT FIO FROM R1 WHERE FIO=a.FIO AND D= ‘БД')
Для определения того факта, что каждый из выбранных в подзапросе кортежей удовлетворяет условию, следует использовать оператор ALL:
3. Все, кто сдал не ниже 4 по всем дисциплинам:
SELECT DISTINCT R1.FIO FROM R1 WHERE 4 <=
ALL (SELECT a.O FROM R1 AS a WHERE R1.FIO = a.FIO)
Кроме того, существует и оператор ANY, который принимает значение TRUE при условии, что хотя бы один кортеж из подзапроса удовлетворяет условию.
6.7. Внешние объединения
SQL92 расширил понятие условного соединения. В SQL89 использовались только соединения, выражаемые через FROM и WHERE: в результирующее отношение попадают только сцепленные по заданным условиям кортежи исходных отношений. Однако на практике необходимо объединять таблицы так, чтобы в результирующее отношение попали все строки первой таблицы, а вместо тех строк второй таблицы, для которых не выполнено условие соединения, в результирующее отношение попадали бы неопределенные значения. Или наоборот, включаются все строки второй таблицы, а отсутствующие строки из первой таблицы дополняются неопределенными значениями. Такие соединения называются внешними, соответственно левыми или правыми. Старые условные соединения получили название - внутренние.
Новый синтаксис оператора SELECT (в части FROM):
FROM <cписок таблиц>|
<выражение естественного соединения>|
<выражение соединения>|
<список таблиц> ::= <имя таблицы> [синоним таблицы] […] [<,имя таблицы> [синоним таблицы]]
<выражение естественного соединения> ::= <имя таблицы 1> NATURAL {INNER| FULL [OUTER]]| LEFT [OUTER] | RIGHT [OUTER]} JOIN <имя таблицы 2>
<выражение соединения> ::= <имя таблицы 1> {INNER | FULL [OUTER] | LEFT [OUTER] | RIGHT [OUTER]} JOIN {ON условие | [USING (список столбцов)] } <имя таблицы 2>
1. Все оценки всех студентов по всем экзаменам, которые они должны были сдавать (если не сдали, то NULL):
SELECT R1.FIO, R1.D, R1.O
FROM (R2 NATURAL JOIN R3) LEFT JOIN R1 USING (FIO,D)
Для иллюстрации отличий между внутренними и внешними соединениями используем следующий набор отношений:
R1 = (Код_товара, Имя_товара)
R2 = (Код_поставщика, Имя_поставщика)
R3 = (Код_товара, Код_поставщика, Кол-во_товара)
Перечислить количество товаров, их имена и их поставщиков:
2. Внутреннее соединение (старый синтаксис):
SELECT R3.Кол-во_товара, R1.Имя_товара, R2.Имя_поставщика
FROM R3, R1, R2
WHERE R3.Код_товара = R1.Код_товара AND
R3.Код_поставщика = R2.Код_поставщика
3. Внутреннее соединение (новый синтаксис):
SELECT R3.Кол-во_товара, R1.Имя_товара, R2.Имя_поставщика
FROM (R3 INNER JOIN R1 ON R3.Код_товара = R1.Код_товара)
INNER JOIN R2 ON R3.Код_поставщика = R2.Код_поставщика
4. Левое внешнее соединение:
SELECT R3.Кол-во_товара, R1.Имя_товара, R2.Имя_поставщика
FROM (R1 LEFT JOIN R3 ON R3.Код_товара = R1.Код_товара)
LEFT JOIN R2 ON R3.Код_поставщика = R2.Код_поставщика
В отличие от запросов 2 и 3, результат этого запроса попадут и те товары, которые ни разу не поставлялись ни одним поставщиком, но присутствуют в “справочнике товаров” R1. Для таких товаров поля Имя_товара и Имя_поставщика будут содержать пустые значения.
