
- •Базы данных
- •Лекция 1 Хранение данных Данные, информация
- •Системы хранения данных на основе файлов
- •База данных
- •Требования к субд
- •Администратор бд (абд)
- •Лекция 2 Модели данных Независимость данных
- •Модель, схема
- •Лекция 3 Ранние модели Иерархическая модель
- •Сетевая модель
- •Лекция 4 Пример базы данных, построенной на сетевой модели Постановка задачи
- •Диаграмма
- •Описание на яод
- •Лекция 5 Реляционная модель Принципы
- •Уточнения
- •Лекция 6 Методы хранения данных и доступа к ним
- •Последовательный метод
- •Прямой метод
- •Индексные методы
- •Индексно-последовательный метод
- •Индексно-произвольный метод
- •Инвертированные списки
- •Хеширование
- •Лекция 7 Реляционная алгебра: определения, изменение отношений
- •Изменение отношений во времени.
- •Лекция 8 Операции реляционной алгебры
- •Булевы операции
- •Выбор; свойства выбора
- •Проекция; свойства проекции
- •Лекция 9 Операции реляционной алгебры (продолжение) Соединение
- •Свойства соединения
- •Лекция 10 Операции реляционной алгебры (продолжение)
- •Деление
- •Постоянные отношения. Переименование атрибутов
- •Эквисоединение, естественное и -соединение
- •Реляционная алгебра. Полнота ограниченного множества операторов
- •Операторы расщепления и фактора
- •Лекция 11 Язык структурных запросов sql
- •Начальные понятия
- •Стандарт ansi
- •Типы данных
- •Интерактивный и встроенный sql
- •Синтаксис
- •Подразделы sql
- •Простейшие действия
- •Функции агрегирования
- •Группировка
- •Возможности форматирования
- •Лекция 12 Язык структурных запросов sql (продолжение) Соединение
- •Вложенные запросы
- •Связанные запросы
- •Предикаты, определенные на подзапросах
- •Объединение
- •Изменение базы данных
- •Лекция 13 Понятие о нормальных формах
- •1 Нормальная форма (1нф)
- •2 Нормальная форма (2нф)
- •3 Нормальная форма (3нф)
- •Нормальная форма Бойса-Кодда (нфбк)
- •4 Нормальная форма (4нф)
- •5 Нормальная форма (5нф) – проекция/соединение
- •Лекция 13 Проектирование данных Процессы проектирования
- •Концептуальное проектирование
- •Логическое проектирование
- •Средства создания модели
- •Лекция 14 Функциональные зависимости
- •Аксиомы вывода
- •Ориентированный ациклический граф вывода
- •Определение реляционной базы данных
- •Представление множества функциональных зависимостей
- •Лекция 15 Покрытия функциональных зависимостей
- •Лемма об эквивалентности фз
- •Неизбыточные покрытия
- •Посторонние атрибуты
- •Канонические покрытия
- •Структура неизбыточных покрытий
- •Оптимальные покрытия
- •3 Нормальная форма
- •Нормализация через декомпозицию и посредством синтеза
- •Нормальная форма Бойса-Кодда
- •Литература
Предикаты, определенные на подзапросах
В состав логических выражений SQL могут входить предикаты, определенные на подзапросах: признак того, что подзапрос не пуст (Exists), признак того, что все элементы удовлетворяют некоторому условию (All) и признак того, что существует хотя бы один элемент, удовлетворяющий некоторому условию (Any, Some).
Функция Exists истинна, если ее аргумент (подзапрос) содержит хотя бы один элемент, в противном случае она ложна. Легко видеть, что в подзапросе этой функции использование агрегатных функций бессмысленно. Рассмотрим применение функции Exists на примерах.
Пример
Выбрать всех покупателей из Тулы, если хотя бы один из них сделал заказ:
Select * From Покупатели Where город=’Тула’ and
Exists(Select * From Заказы Where ном_пок in
(Select ном_пок From Покупатели Where город=’Тула’));
Заметим, что здесь в подзапросе используется конструкция Select *… Использование ее в Exists – это единственный случай корректного употребления варианта «*» в подзапросе.
Выбрать номера всех продавцов, у которых более одного покупателя:
Select Distinct ном_прод From Заказы a Where
Exists(Select * From Заказы b Where a.ном_прод=b.ном_прод
and a.ном_пок<>b.ном_пок);
В данном случае Exists используется в сочетании со связанным подзапросом. Дополним предыдущий пример соединением: выберем имена всех продавцов, у которых более одного покупателя:
Select Distinct a.ном_прод, имя_прод From Заказы a, Продавцы c Where
Exists(Select * From Заказы b
Where a.ном_прод=b.ном_прод
and a.ном_пок<>b.ном_пок) and a.ном_прод=c.ном_прод;
Конец примера
Функция All истинна, если каждое значение ее аргумента (подзапроса) удовлетворяет условию, в которое она входит. Естественно, эта функция редко может применяться для операции равенства: в этом случае все элементы выборки должны быть равны между собой. Неравенство – более содержательная операция, она обозначает, что левая часть не равна ни одному из элементов выборки. Правда, этот предикат легко реализуется операцией in. Более интересны операции «больше», «меньше» и т.п. Рассмотрим применение функции All на примерах.
Пример
Выбрать всех покупателей, значимость которых выше значимости любого покупателя из Тулы:
Select * From Покупатели Where значимость>
All(Select значимость From Покупатели Where город=’Тула’);
Этот же запрос можно сформулировать с Exists:
Select * From Покупатели a Where
not Exists(Select * From Покупатели b
Where a.значимость<=b.значимость and b.город=’Тула’);
Конец примера
Функция Any (синоним – Some) истинна, если хотя бы одно значение ее аргумента (подзапроса) удовлетворяет условию, в которое она входит. Эта функция чаще используется для операции равенства, чем для «больше», «меньше» и т.п. Рассмотрим применение функции Any на примерах.
Пример
Выбрать всех покупателей, живущих в одном городе с продавцами:
Select * From Покупатели Where город= Any(Select город From Продавцы;
Этот же запрос можно сформулировать с in. С Exists этот запрос выглядит так:
Select * From Покупатели a Where
Exists(Select * From Продавцы b Where a.город=b.город);
Конец примера
Любой запрос как с Any, так и с All, может быть выражен через Exists, но в этом случае требуется более глубокая вложенность запросов и нередко встречаются связанные подзапросы.
Уточним, как ведут себя функции Any, All и Exists в особых случаях. Для пустой выборки All принимает значение истина, Any и Exists – ложь. При сравнении с null функции Any и All принимают неопределенное значение, Exists никогда неопределенное значение не принимает.