
- •1. Введение в бд
- •2. Теоретические основы бд
- •2.1 Базы данных
- •2.2. Архитектуры обработки информации
- •Ошибка! Ошибка связи.
- •Ошибка! Ошибка связи.
- •2.3 Модели баз данных
- •2.3.1 Иерархическая модель данных
- •Ошибка! Ошибка связи.
- •Ошибка! Ошибка связи.
- •2.3.2 Сетевая модель данных
- •Ошибка! Ошибка связи.
- •2.3.3 Реляционная модель данных
- •3. Реляционный подход к организации бд
- •3.1 Базовые понятия реляционных баз данных
- •Ошибка! Ошибка связи.
- •3.2 Фундаментальные свойства отношений
- •3.3 Взаимосвязь отношений
- •4. Реляционная алгебра
- •4.1 Обзор реляционной алгебры
- •Замкнутость реляционной алгебры
- •Отношения, совместимые по типу
- •4.2 Теоретико-множественные операторы
- •4.3 Специальные реляционные операторы
- •4.4 Зависимые реляционные операторы
- •4.5 Примитивные реляционные операторы
- •4.6 Запросы, невыразимые средствами реляционной алгебры
- •4.7 Кросс-таблицы
- •5. Проектирование бд
- •5.1. Цели и этапы проектирования
- •5.2 Уровни моделирования (проектирования) бд
- •5.3 Критерии оценки качества логической модели данных
- •5.4 Нормализация и ее необходимость
- •5.5 Теория нормализации
- •5.6 Элементы модели "сущность-связь"
- •Основные понятия er-диаграмм
- •Ошибка! Ошибка связи.
- •6. Элементы языка sql
- •6.1 Типы данных
- •6.2 Операторы dml (определения объектов базы данных)
- •6.2.1 Операторы работы с таблицами
- •6.3 Операторы dml (операторы манипулирования данными)
- •6.3.1 Примеры использования операторов манипулирования данными
- •Insert - вставка строк в таблицу
- •6.3.2 Update - обновление строк в таблице
- •6.3.3 Delete - удаление строк в таблице
- •6.3.4 Выбор данных из таблицы select
- •6.3.4.1 Общий синтаксис команды select
- •6.3.4.2 Примеры работы с использованием оператора select
- •Использование агрегатных функций в запросах
- •Использование агрегатных функций с группировками
- •Использование подзапросов
- •Использование объединения, пересечения и разности
- •6.3.4.3 Порядок выполнения оператора select
- •6.3.4.4 Реализация реляционной алгебры средствами оператора select (Реляционная полнота sql)
- •6.4 Объекты и концепции базы данных
- •6.4.1 Таблицы (Tables)
- •6.4.2 Столбцы (Columns)
- •6.4.3 Типы данных (Data types)
- •Тип данных blob
- •6.4.4 Домены (Domains)
- •6.4.5 Справочные ограничения целостности (Referential integrity constraints)
- •6.4.6 Индексы (Indexes)
- •6.4.7 Представления (Views)
- •6.4.8. Хранимые процедуры (Stored procedures)
- •6.4.9 Триггеры (Triggers)
- •6.4.10 Генераторы (Generators)
- •6.4.11 Защита (Security)
- •6.5 Операторы sql для работы с объектами бд
- •6.5.1 Представления
- •6.5.2 Хранимые процедуры
- •6.5.3 Генераторы
- •6.5.4 Триггеры
- •6.5.5 Индексы
- •6.6 Инструкции sql
- •7. Физическая организация и работа субд
- •7.1 Хранение данных
- •Ошибка! Ошибка связи.
4.3 Специальные реляционные операторы
Выборкой (ограничением, селекцией) на отношении A с условием c называется отношение с тем же заголовком, что и у отношения A, и телом, состоящем из кортежей, значения атрибутов которых при подстановке в условие c дают значение ИСТИНА. c представляет собой логическое выражение, в которое могут входить атрибуты отношения A и (или) скалярные выражения.
В простейшем случае условие c имеет вид XY, где - один из операторов сравнения (=, <>, <, <=, >, >= и т.д.), а X и Y - атрибуты отношения A или скалярные значения. Такие выборки называются -выборки (тэта-выборки) или -ограничения, -селекции.
Синтаксис операции выборки: A WHERE c, или A WHERE XY
Пример 6. Пусть дано отношение A с информацией о сотрудниках:
Результат выборки A WHERE Стаж>1 будет иметь вид:
ИД_Сотр |
Фамилия |
Стаж |
1 |
Иванов |
3 |
3 |
Сидоров |
4 |
Смысл операции выборки очевиден - выбрать кортежи отношения, удовлетворяющие некоторому условию. Таким образом, операция выборки дает "горизонтальный срез" отношения по некоторому условию.
Проекция
Проекцией отношения A по атрибутам X, Y,…, Z, где каждый из атрибутов принадлежит отношению A, называется отношение с заголовком (X, Y,…, Z) и телом, содержащим множество кортежей вида (x, y,…, z), таких, для которых в отношении A найдутся кортежи со значением атрибута X равным x, значением атрибута Y равным y, …, значением атрибута Z равным z.
Синтаксис операции проекции: A[X, Y,…, Z]
Замечание. Операция проекции дает "вертикальный срез" отношения, в котором удалены все возникшие при таком срезе дубликаты кортежей.
Пример 7. Пусть дано отношение B с информацией о должностях (табл. 6)
Проекция B[Должность] будет иметь вид:
Должность |
Профессор |
Доцент |
Ассистент |
Соединение
Операция соединения отношений, наряду с операциями выборки и проекции, является одной из наиболее важных реляционных операций.
Обычно рассматривается несколько разновидностей операции соединения:
Общая операция соединения
-соединение (тэта-соединение)
Экви-соединение
Естественное соединение
Наиболее важным из этих частных случаев является операция естественного соединения. Все разновидности соединения являются частными случаями общей операции соединения.
Общая операция соединения
Соединением отношений A и B по условию c называется отношение
(A TIMES B) WHERE c
c представляет собой логическое выражение, в которое могут входить атрибуты отношений A и B и(или) скалярные выражения.
Т. о., операция соединения есть результат последовательного применения операций декартового произведения и выборки. Если в отношениях A и B имеются атрибуты с одинаковыми наименованиями, то перед выполнением соединения такие атрибуты необходимо переименовать.
Тэта-соединение
Пусть отношение A содержит атрибут X, отношение B содержит атрибут Y, а - один из операторов сравнения (=, <>, <, <=, >, >= и т.д.). Тогда -соединением отношения A по атрибуту X с отношением B по атрибуту Y называют отношение: (A TIMES B) WHERE XY
Это частный случай операции общего соединения. Иногда, для операции -соединения применяют следующий, более короткий синтаксис: A[XY]B
Пример 8. Пример 8. Рассмотрим учебное заведение, в котором имеются данные о преподавателях и перечне дисциплин. За каждой дисциплиной закреплен определенный объем часов, а каждый преподаватель имеет определенную нагрузку в часах. Идея в том, что каждый преподаватель не может читать дисциплины, объем которых превышает его возможную нагрузку. Для рассматриваемого примера в таблицах 12 и 13 приведены отношения с соответствующими записями для сотрудников и дисциплин.
Таблица 13 Отношение A (Сотрудники) Таблица 14 Отношение B (Дисциплины)
ИД_Сотр |
Фамилия |
X (Нагрузка, часов) |
|
ИД_Дис |
Название дисциплины |
Y (Объем, часов) |
||||||
1 |
Иванов |
50 |
|
1 |
ЗИ |
36 |
||||||
2 |
Костров |
72 |
|
2 |
УД |
54 |
||||||
3 |
Сидоров |
34 |
|
3 |
ОС |
18 |
Ответ на вопрос "какие сотрудники имеют право читать какие дисциплины?" дает -соединение A[X>=Y]B:
ИД_Сотр |
Фамилия |
X (Нагрузка, часов) |
ИД_Дис |
Название дисциплины |
Y (Объем часов) |
1 |
Иванов |
50 |
1 |
ЗИ |
36 |
1 |
Иванов |
50 |
2 |
ОС |
54 |
2 |
Костров |
72 |
1 |
ЗИ |
36 |
2 |
Костров |
72 |
2 |
УД |
54 |
2 |
Костров |
72 |
3 |
ОС |
18 |
3 |
Сидоров |
34 |
3 |
ОС |
18 |
Экви-соединение
Наиболее важным частным случаем -соединения является случай, когда есть просто равенство.
Синтаксис экви-соединения: A[X=Y]B
Пример 9. Пусть имеются отношения P, D и PD, хранящие информацию о лекторах, дисциплинах и количестве вычитываемых часов (для удобства введем краткие наименования атрибутов):
Таблица 16 Отношение P (Сотрудники) Таблица 17 Отношение D (Дисциплины)
ИД_Сотр |
PNAME (Фамилия) |
|
ИД_Дис |
Название дисциплины DNAME |
||||
1 |
Иванов |
|
1 |
ЗИ |
||||
2 |
Костров |
|
2 |
УД |
||||
3 |
Сидоров |
|
3 |
ОС |
Таблица 18 Отношение PD (Выработка)
ИД_Сотр |
ИД_Дис |
Общий объем в часах VOLUME |
1 |
1 |
36 |
1 |
2 |
54 |
1 |
3 |
18 |
2 |
1 |
36 |
2 |
2 |
54 |
3 |
1 |
36 |
Ответ на вопрос, какие дисциплины вычитываются какими лекторами, дает экви-соединение P[ИД_Сотр=ИД_Сотр]PD. На самом деле, т.к. в отношениях имеются одинаковые атрибуты, то требуется сначала переименовать атрибуты, а потом выполнить экви-соединение. Запись становится более громоздкой:
(P RENAME ИД_Сотр AS ИД_Сотр1)[PNUM1=PNUM2](PD RENAME PNUM AS ИД_Сотр 2)
Обычно, такой сложной формой записи не пользуются. Но как бы то ни было, в результате имеем отношение:
ИД_Сотр1 |
Фамилия |
ИД_Сотр2 |
ИД_Дис |
Общий объем в часах VOLUME |
1 |
Иванов |
1 |
1 |
36 |
1 |
Иванов |
1 |
2 |
54 |
1 |
Иванов |
1 |
3 |
18 |
2 |
Петров |
2 |
1 |
36 |
2 |
Петров |
2 |
2 |
54 |
3 |
Сидоров |
3 |
1 |
36 |
Недостатком экви-соединения является то, что если соединение происходит по атрибутам с одинаковыми наименованиями (а так чаще всего и происходит!), то в результирующем отношении появляется два атрибута с одинаковыми значениями. В нашем примере атрибуты ИД_Сотр1 и ИД_Сотр2 содержат дублирующие данные. Избавиться от этого недостатка можно, взяв проекцию по всем атрибутам, кроме одного из дублирующих. Именно так действует естественное соединение.
Естественное соединение
Пусть даны отношения A(A1, A2,…,An; X1, X2, …, Xp) и B(X1, X2,…,Xp; B1, B2,…Bm), имеющие одинаковые атрибуты X1, X2,…,Xp (т.е. атрибуты с одинаковыми именами и определенные на одинаковых доменах).
Тогда естественным соединением отношений A и B называется отношение с заголовком (A1, A2, …, An, X1, X2, …, Xp, B1, B2, …, Bm) и телом, содержащим множество кортежей , таких, что (a1, a2, …, an, x1, x2, …, xp)A и (x1, x2, …, xp, b1, b2, …, bm,)B.
Естественное соединение настолько важно, что для него используют специальный синтаксис: A JOIN B
Замечание. В синтаксисе естественного соединения не указываются, по каким атрибутам производится соединение. Естественное соединение производится по всем одинаковым атрибутам.
Замечание. Естественное соединение эквивалентно следующей последовательности реляционных операций:
Переименовать одинаковые атрибуты в отношениях
Выполнить декартово произведение отношений
Выполнить выборку по совпадающим значениям атрибутов, имевших одинаковые имена
Выполнить проекцию, удалив повторяющиеся атрибуты
Переименовать атрибуты, вернув им первоначальные имена
Замечание. Можно выполнять последовательное естественное соединение нескольких отношений. Нетрудно проверить, что естественное соединение (как, впрочем, и соединение общего вида) обладает свойством ассоциативности, т.е. (A JOIN B) JOIN C=A JOIN (B JOIN C)
поэтому такие соединения можно записывать, опуская скобки: A JOIN B JOIN C
Пример 10. В предыдущем примере ответ на вопрос "какие дисциплины читаются лекторами", более просто записывается в виде естественного соединения трех отношений P JOIN PD JOIN D (для удобства просмотра порядок атрибутов изменен, это является допустимым по свойствам отношений):
ИД_Сотр |
Фамилия |
ИД_Дис |
Название дисциплины DNAME |
Общий объем в часах VOLUME |
1 |
Иванов |
1 |
ЗИ |
36 |
1 |
Иванов |
2 |
УД |
54 |
1 |
Иванов |
3 |
ОС |
18 |
2 |
Петров |
1 |
ЗИ |
36 |
2 |
Петров |
2 |
УД |
54 |
3 |
Сидоров |
1 |
ЗИ |
36 |
Деление
Пусть даны отношения A(X1, X2,…,Xn; Y1, Y2,…Ym) и B(Y1, Y2,…Ym), причем атрибуты Y1, Y2,…Ym - общие для двух отношений.
Делением отношений A на B называется отношение с заголовком (X1, X2,…,Xn) и телом, содержащим множество кортежей (x1, x2,…xn), таких, что для всех кортежей (y1, y2, …, ym)B в отношении A найдется кортеж (x1, x2, …, xn, y1, y2, …, ym).
Отношение A выступает в роли делимого, отношение B выступает в роли делителя. Деление отношений аналогично делению чисел с остатком.
Синтаксис операции деления: A DEVIDEBY B
Замечание. Типичные запросы, реализуемые с помощью операции деления, обычно в своей формулировке имеют слово "все" - "какие преподаватели читают все дисциплины?".
Пример 11. В примере с сотрудниками, дисциплинами и читаемыми дисциплинами ответим на вопрос, "какие сотрудники читают все дисциплины?".
В качестве делимого возьмем проекцию X=PD[ИД_Сотр, ИД_Дис], содержащую номера сотрудников и номера читаемых ими дисциплинами:
ИД_Сотр |
ИД_Дис |
1 |
1 |
1 |
2 |
1 |
3 |
2 |
1 |
2 |
2 |
3 |
1 |
В качестве делителя возьмем проекцию Y=D[ИД_Дис], содержащую список номеров всех дисциплин (не обязательно вычитываемых кем-либо):
ИД_Дис |
1 |
2 |
3 |
Деление X DEVIDE Y дает список номеров преподавателей, вычитывающих все дисциплины:
ИД_Сотр |
1 |
Оказалось, что только сотрудник с номером 1 читает все виды лекций.
Примеры использования реляционных операторов
Пример 12. Получить имена сотрудников, читающих лекцию 2.
Решение: ((DP JOIN P) WHERE ИД_Дис=2)[PNAME]
Пример 13. Получить имена сотрудников, читающих по крайней мере лекцию «ЗИ».
Решение: (((D WHERE DNAME=ЗИ) JOIN DP) JOIN P)[PNAME]
Ответ на этот запрос можно получить и иначе:
(((D JOIN DP) JOIN P) WHERE DNAME=ЗИ)[PNAME]
Пример 14. Получить имена сотрудников, читающих все лекции.
Решение: ((DP[ИД_Сотр, ИД_Дис] DEVIDEBY D[ИД_Дис]) JOIN P)[PNAME]
Пример 15. Получить имена сотрудников, не читающих лекцию 2.
Решение: ((P[ИД_Сотр] MINUS((P JOIN DP) WHERE ИД_Дис=2)[ИД_Сотр] JOIN P)[PNAME]
Ответ на этот запрос можно получить и пошагово:
T1=P[ИД_Сотр] - получить список номеров всех сотрудников;
T2= P JOIN DP - соединить данные о сотрудниках и читаемых лекциях
T3=T2 WHERE ИД_Дис=2 - в данных о сотрудниках и читаемых лекциях оставить только данные о лекции 2.
T4=T3[ИД_Сотр] - получить список номеров сотрудников, читающих лекцию 2.
T5=T1 MIBUS T4 - получить список номеров сотрудников, не читающих лекцию 2.
T6=T5 JOIN P - соединить список номеров сотрудников, не читающих лекцию 2 с данными о сотрудниках (получатся полные данные о сотрудниках, не читающих лекцию 2).
T7=T6[P[NAME] - искомый ответ (имена сотрудников, не читающих лекцию 2).