Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Белобжеский_Лекции_по_ББД.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5.5 Mб
Скачать

Теоретико-множественные операции

Над наборами записей, содержащихся в таблицах базы данных и/или возвращаемых запросами, можно совершать теоретико-множественные операции, такие как декартово произведение, объединение, пересечение и вычитание. Что такое теоретико-множественные операции, достаточно подробно рассматрива­лось в гл. 1.

Декартово произведение наборов записей

Декартово произведение двух таблиц уже рассматривалось ранее: Напомню, что запрос:

SELECT списокСтолбцов FROM Tl, T2, ... Тn;

возвращает набор записей, полученный в результате декартового произведения наборов записей из таблиц Т1, Т2, ... , Tn. Таблицы, указанные в операторе from, могут быть как таблицами базы данных, так и виртуальными таблицами, возвращаемыми какими-нибудь запросами.

Иногда требуется получить декартово произведение таблицы самой на себя. В этом случае необходимо применить различные псевдонимы для этой таблицы, например:

SELECT списокСтолбцов FROM Mytab Tl, Mytab T2;

Обратите внимание, что попытка выполнить запрос:

SELECT списокСтолбцов FROM Mytab, Mytab;

приведет к ошибке.

В списке столбцов следует использовать полные имена столб­цов, используя псевдонимы таблиц, или символ (*), если требу­ется получить все столбцы.

Для декартова произведения в SQL также допустим синтаксис с ключевыми словами cross join (перекрестное соединение):

SELECT списокСтолбцов FROM Mytab Tl CROSS JOIN Mytab T2;

Рассмотренные выражения работают в полнофункциональных ба­зах данных. В Microsoft Access для получения декартового произ­ведения возможно использование выражения (SELECT список-столбцов FROM T1, T2, ... Tn), только если все таблицы в списке имеют различные имена. Если требуется декартово произведение таблицы самой на себя, то в выражении (SELECT список-столбцов FROM Mytab Tl, Mytab T2) Access автоматически добавит ключевое слово as перед каждым псевдонимом. Попытка использования ключевых слов cross join в Access приведет к ошибке.

Запросы на декартово произведение сами по себе очень редко используются. Они приобретают некоторый смысл, если приме­няются с оператором where.

Допустим, что имеется таблица

Рейсы (НАЧАЛЬНЫЙ_ПУНКТ, КОНЕЧНЫЙ_ПУНКТ),

содержащая сведения о том, из каких пунктов и в какие можно попасть с помощью того или иного авиарейса.

Рис. 5.4. Граф и таблица достижимости пунктов

На рис. 5.4 показан граф достижимости пунктов некоторым авиарейсом и соответствующая ему таблица Рейсы. Каждой стрелке на графе и каждой записи таблицы соответствует некоторый рейс. Не трудно заметить, что из некоторых пунктов в другие можно попасть только с пересадкой на другой рейс, т. е. через транзитный пункт. Следующий запрос возвращает таблицу (рис. 5.5), содержащую сведения о достижимости пунк­тов в точности через один транзитный пункт:

SELECT Т1.НАЧАЛЬНЫЙ_ПУНКТ, Т2.КОНЕЧНЫЙ_ПУНКТ

FROM Рейсы Т1, Рейсы Т2

WHERE Tl.КОНЕЧНЫЙ_ПУНКТ = Т2.НАЧАЛЬНЫЙ_ПУНКТ;

Рис. 5.5. Таблица достижимости пунктов через один транзитный пункт

Рассмотрим данный запрос более подробно. Сначала он выполняет декартово произведение таблицы Рейсы на эту же таблицу. В результате получается таблица с четырьмя столбцами:

Т1.НАЧАЛЬНЫЙ_ПУНКТ, Т1.КОНЕЧНЫЙ_ПУНКТ, Т2.НАЧАЛЬНЫЙ_ПУНКТ

и Т2.КОНЕЧНЫЙ_ПУНКТ. Затем из полученной таблицы выбираются такие записи, в которых T1.конечный_пункт = Т2.начальный_пункт. Это и есть пары пунктов, между которыми в графе достижимости находится один промежуточный пункт. Наконец, из четырех столбцов выделяются только два:

T1.НАЧАЛЬНЫЙ_ПУНКТ и Т2.КОНЕЧНЫЙ_ПУНКТ.

Запрос, содержащий сведения о том, в какие пункты можно по­пасть так или иначе, будет рассмотрен в разд. 5.2.2.