- •2. Реляционная модель данных
- •2.1. Определения и понятия
- •2.2. Первичные ключи и индексы
- •2.3. Реляционные отношения между таблицами
- •2.3.1. Отношение один-ко-многим
- •2.3.2. Отношение один-к-одному
- •2.3.3. Отношение многие-ко-многим
- •2.3.4. Связи между записями одной таблицы
- •2.4. Ссылочная целостность
- •2.5. Индексы
- •Упражнения и задачи
- •3. Нормализация отношений
- •3.1. Первая нормальная форма
- •3.2. Функциональные зависимости и детерминанты
- •3.3. Вторая нормальная форма
- •3.4. Третья нормальная форма
- •3.5. Нормальная форма Бойса-Кодда (нфбк)
- •3.6. Нормализация за и против
- •Контрольные вопросы
- •Упражнения и задачи
- •4. Операции с данными в реляционной модели
- •4.1. Объединение
- •4.2. Пересечение
- •4.3. Вычитание
- •4.4. Декартово произведение
- •4.5. Выбор
- •4.6. Проекция
- •4.7. Соединение
- •4.8. Деление
- •Упражнения и задачи
- •5. Запросы к бд
- •5.1. Простые запросы
- •5.2. Многотабличные запросы
- •5.3. Подзапросы
- •6. Сетевая модель данных
- •6.1. Исторический контекст
- •6.2. Основные понятия и определения
- •Торговый-агент
- •Строка-элемент
- •6.3. Преимущества и недостатки сетевых моделей
- •Упражнения и задачи
- •7. Иерархическая модель данных
- •7.1. Основные понятия и определения
- •7.2. Преимущества и недостатки иерархических моделей
- •Упражнения и задачи
- •Часть 2. Управление окружением базы данных
- •1. Администрирование баз данных
- •1.1. Функции абд
- •1.1.1. Работа с пользователями
- •1.1.2. Установление стандартов и процедур
- •1.2. Задачи абд
- •2. Защита базы данных
- •2.1. Идентификация пользователя
- •2.2. Проверка полномочий и представления данных
- •2.3. Шифровка
- •Метод поалфавитной подстановки
- •2.4. Секретность данных
- •4. Целостность данных
- •4.1. Контроль типов
- •4.2. Контроль изменений
- •4.3. Целостность на уровне ссылок
- •5. Параллельная работа с бд
- •5.1. Обработка транзакций
- •5.2. Параллельная работа с бд
- •Литература
5.3. Подзапросы
Подзапрос может помещаться в команду WHERE запроса, в результате чего возможности команды WHERE расширяются. Рассмотрим пример.
Запрос:Вывести специальности рабочих, назначенных на здание 435?
SELECT Специальность
FROM Работник
WHERE № работника IN
(SELECT № работника
FROM Работа
WHERE № здания = 435 )
Подзапрос в этом примере
(SELECT № работника
FROM Работа
WHERE № здания = 435 )
Запрос, в котором содержится подзапрос, называется внешним запросомили главным запросом. Подзапрос приводит к созданию следующего множества № работников:
№ Работника
1412
1235
Затем это множество «№ Работников» занимает место подзапроса во внешнем запросе. С этого момента выполняется внешний запрос, использующий множество, созданное подзапросом. Внешний запрос обрабатывает каждую строку таблицы «Работник» в соответствии с условием WHERE. Если «№ работника» строки лежит во множестве, созданном подзапросом, то «Специальность» строки выбирается и выводится в результирующей таблице:
Специальность
Штукатур
Электрик
Очень важно, что фраза SELECT подзапроса содержит «№ работника» и только «№ работника. В противном случае фраза WHERE внешнего запроса, означающая, что «№ работника» лежит в множестве «№ работников», не имела бы смысла.
Подзапрос может логично выполняться прежде, чем хотя бы одна строка рассматривается главным запросом. В некотором смысле подзапрос независим от главного запроса. Он может выполняться как полноценный запрос. Такой подзапрос называется некоррелированным подзапросом.
Приведем пример подзапроса внутри подзапроса.
Запрос: Вывести фамилии работников, назначенных на здания офисов.
SELECT Фамилия
FROM Работник
WHERE № работника IN
(SELECT № работника
FROM Работа
WHERE № здания IN
(SELECT № здания
FROM Здание
WHERE Тип = 'Офис' ))
Результат:
Фамилия
И. Петров
Нигде не нужно указывать перед именами столбцов имена таблиц, поскольку каждый подзапрос обрабатывает одну и только одну таблицу, так что никаких неопределенностей возникнуть не может. Выполнение запроса происходит в порядке изнутри наружу.
Коррелированный подзапрос - подзапрос, результат которого зависит от строки, рассматриваемой главным запросом.
Ниже приведен пример такого подзапроса.
Запрос: Вывести фамилии работников, чьи почасовые ставки выше, чем ставки их менеджеров.
SELECT Фамилия
FROM Работник А
WHERE А. Недельная зарплата >
(SELECT B.Недельная зарплата
FROM Работник В
WHERE В.№ работника = А.№ менеджера)
Результат:
Фамилия
К. Иванов
Обратите внимание, что поскольку «А. Недельная зарплата» может сравниваться только с одной величиной, подзапрос должен выдавать только одну величину. Эта величина меняется в зависимости от того, какая строка А рассматривается. Таким образом, подзапрос коррелирует с главным запросом.
