Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных.doc
Скачиваний:
114
Добавлен:
16.03.2016
Размер:
5.67 Mб
Скачать

Формальные определения

Пусть требуется выполнить некоторую операцию соединения над таблицами table1иtable2. Тогда:

  • Обозначим черезCPрезультат выполнения запроса144)

144 Интересно, что для этого запроса возможна альтернативная формулировка с использованием операции CROSS JOIN: SELECT * FROM table1 CROSS JOIN table2. Может возникнуть естественный вопрос: зачем вводить специальную конструкцию для декартова произведения? По мнению автора, эта конструкция была введена, главным образом, для повышения уровня общности языка SQL. Кроме того, использование явного ключевого слова CROSS JOIN является подтверждением того, что пользователь действительно может получить декартово произведение, а не упустил по ошибке раздел WHERE.

SELECT *

FROM table1, table2

  • Если задается операция JOIN(илиNATURAL JOIN) без явного указания типа соединения (join_type), то по умолчанию имеется в видуINNER JOIN(илиNATURAL INNER JOIN).

  • Если в спецификации соединения (join_specification) указано ключевое словоON, то все ссылки на столбцы, встречающиеся в условном выражении (conditional_expression), должны указывать на столбцы таблицtable1иtable2или на столбцы таблиц внешнего запроса. Если в этом условном выражении присутствует вызов агрегатной функции, то соединенная таблица может фигурировать только в подзапросах, используемых в разделахHAVINGилиSELECTвнешнего запроса, и ссылка на столбец в вызове функции должна указывать на столбец таблицы внешнего запроса.

  • Для прямых соединений (CROSS JOIN) и всех других видов соединения, включающих разделON, заголовок результата операции совпадает с заголовком таблицыCP.

  • Если в спецификации вида соединения присутствуют ключевые слова NATURALилиUSING, то заголовок результата операции определяется следующим образом:

    • если в спецификации вида соединения присутствует ключевое слово NATURAL, то будем называтьсоответствующими столбцами соединения(corresponding join column) все столбцы таблицtable1иtable2, которые имеют в заголовках этих таблиц одинаковые имена. Если в спецификации вида соединения присутствует ключевое словоUSING, то будем называть соответствующими столбцами соединения (corresponding join column) все столбцы таблицtable1иtable2, имена которых входят в список имен столбцов разделаUSING(эти столбцы должны быть одноименными в заголовках обеих таблиц). В обоих случаях типы данных каждой пары соответствующих столбцов должны быть совместимыми;

    • будем называть списком выборки соответствующих столбцов соединения (select_list of corresponding join columns – SLCC) список элементов видаCOALESCE (table1.c, table2.c) AS c*, где с145)является именем соответствующего столбца соединения. Элементы располагаются в том порядке, в котором они появляются в заголовке таблицыtable1. Обозначим черезSLT1(SLT2) список имен столбцов таблицыtable1(table2), которые не являются соответствующими столбцами соединения. Имена располагаются в том же порядке, в котором они появляются в заголовке соответствующей таблицы;

    • заголовок результата совпадает с заголовком результата запроса

SELECT SLCC, SLT1, SLT2

FROM table1, table2;

  • Набор строк результата (множество или мультимножество) определяется по следующим правилам. Обозначим через Tследующие наборы строк:

    • если видом соединения является UNION JOIN, тоT– пусто;

145 Для удобства читателей напомним, что по определению выражение COALESCE (V1, V2) эквивалентно следующему выражению с переключателем: CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END.

    • если видом соединения является CROSS JOIN, тоTвключает все строки, входящие вCP;

    • если в спецификацию вида соединения входит раздел ON, тоTвключает все строкиCP, для которых результатом вычисления условного выражения являетсяtrue;

    • если в спецификацию вида соединения входят разделыNATURALилиUSING, и списокSLCCне является пустым, тоTвключает все строкиCP, для которых значения соответствующих столбцов соединения совпадают146);

    • если в спецификацию вида соединения входят разделы NATURALилиUSING, и списокSLCCявляется пустым, тоTвключает все строкиCP.

  • Обозначим через P1(P2) набор (множество или мультимножество) всех строк таблицыtable1(table2), каждая из которых участвует в образовании некой строкиT.

  • Обозначим через U1(U2) набор (множество или мультимножество) всех строк таблицыtable1(table2), ни одна из которых не участвует в образовании какой-либо строкиT.

  • Обозначим через X1набор (множество или мультимножество) всех строк, образуемых из строк набораU1путем добавления справа подстроки из неопределенных значений, содержащей столько неопределенных значений, сколько столбцов содержит таблицаtable2. Обозначим черезX2набор (множество или мультимножество) всех строк, образуемых из строк набораU2путем добавления слева подстроки из неопределенных значений, содержащей столько неопределенных значений, сколько столбцов содержит таблицаtable1.

  • Для соединений вида CROSS JOINиINNER JOINпустьSобозначает тот же набор строк, что иT.

  • Для соединений вида LEFT OUTER JOINпустьSобозначает набор строк, являющийся результатом выражения запросов

SELECT * FROM T

UNION ALL

SELECT * FROM X1;

  • Для соединений вида RIGHT OUTER JOINпустьSобозначает набор строк, являющийся результатом выражения запросов

SELECT * FROM T

UNION ALL

SELECT * FROM X2;

  • Для соединений вида FULL OUTER JOINпустьSобозначает набор строк, являющийся результатом выражения запросов

SELECT * FROM T

UNION ALL

SELECT * FROM X1

UNION ALL

SELECT * FROM X2;

146 Совпадают в строгом смысле, т.е. значение столбца table1.c совпадает со значением столбца table2.c тогда и только тогда, когда значением операции сравнения table1.c = table2.c является true.

  • Для соединений вида UNION JOINпустьSобозначает набор строк, являющийся результатом выражения запросов

SELECT * FROM X1

UNION ALL

SELECT * FROM X2;

  • Если в спецификации вида соединения присутствуют ключевые слова NATURALилиUSING, то результат операции совпадает с результатом выражения запросов

SELECT SLCC, SLT1, SLT2

FROM S;

  • Во всех остальных случаях результат операции совпадает с S.