Стандарт SQL2 расширил понятие условного объединения. В стандарте SQL1 при объединении отношений использовались только условия, задаваемые в части WHERE оператора SELECT, и в этом случае в результирующее отношение попадали только сцепленные по заданным условиям кортежи исходных отношений, для которых эти условия были определены и истинны. Однако в действительности часто необходимо объединять таблицы таким образом, чтобы в результат попали все строки из первой таблицы, а вместо тех строк второй таблицы, для которых не выполнено условие соединения, в результат попадали бы неопределенные значения. Или наоборот, включаются все строки из правой (второй) таблицы, а отсутствующие части строк из первой таблицы дополняются неопределенными значениями. Такие объединения были названы внешними в противоположность объединениям, определенным стандартом SQL1, которые стали называться внутренними.
В общем случае синтаксис части FROM в стандарте SQL2 выглядит следующим образом:
FROM <список исходных таблиц> |
< выражение естественного объединения > |
< выражение объединения >
< выражение перекрестного объединения > |
< выражение запроса на объединение >
<список исходных таблиц>::= <имя_таблицы_1>
[ имя синонима таблицы_1] [ ...]
[,<имя_таблицы_п>[ <имя синонима таблицы_n> ] ]
<выражение естественного объединениям:: =
<имя_таблицы_1> NATURAL { INNER | FULL [OUTER] | LEFT [OUTER] | RIGHT [OUTER]} JOIN <имя_таблицы_2>
<выражение перекрестного объединениям: = <имя_таблицы_1> CROSS JOIN <имя_таблицы_2>
<выражение запроса на объединением:=
<имя_таблицы_1> UNION JOIN <имя_таблицы_2>
<выражение объединениям := <имя_таблицы_1> { INNER |
FULL [OUTER] | LEFT [OUTER] | RIGHT [OUTER]} JOIN {ON условие [USING (список столбцов)]} <имя_таблицы_2>
В этих определениях INNER — означает внутреннее объединение, LEFT — левое объединение, то есть в результат входят все строки таблицы 1, а части результирующих кортежей, для которых не было соответствующих значений в таблице 2, дополняются значениями NULL (неопределено).
Ключевое слово RIGHT означает правое внешнее объединение, и в отличие от левого объединения в этом случае в результирующее отношение включаются все строки таблицы 2, а недостающие части из таблицы 1 дополняются неопределенными значениями, Ключевое слово FULL определяет полное внешнее объединение: и левое и правое. При полном внешнем объединении выполняются и правое и левое внешние объединения и в результирующее отношение включаются все строки из таблицы 1, дополненные неопределенными значениями, и все строки из таблицы 2, также дополненные неопределёнными значениями.
Ключевое слово OUTER означает внешнее, но если заданы ключевые слова FULL, LEFT, RIGHT, то объединение всегда считается внешним.
Рассмотрим примеры выполнения внешних объединений. Снова вернемся к БД «Сессия». Создадим отношение, в котором будут стоять все оценки, полученные всеми студентами по всем экзаменам, которые они должны были сдавать. Если студент не сдавал данного экзамена, то вместо оценки у него будет стоять неопределенное значение. Для этого выполним последовательно естественное внутреннее объединение таблиц R2 и R3 по атрибуту Группа, а полученное отношение соединим левым внешним естественным объединением с таблицей R1, используя столбцы ФИО и Дисциплина. При этом в стандарте разрешено использовать скобочную структуру, так как результат объединения может быть одним из аргументов в части FROM оператора SELECT.
SELECT Rl.ФИО, R1.Дисциплина. Rl.Оценка
FROM (R2 NATURAL INNER JOIN R3 ) LEFT JOIN Rl USING ( ФИО. Дисциплина)
Результат:
ФИО |
Дисциплина |
Оценка |
||
Петров Ф. И. |
Базы данных |
5 |
||
Сидоров К. А. |
Базы данных |
4 |
||
Миронов Л. В. |
Базы данных |
2 |
||
Степанова К. Е. |
Базы данных |
2 |
||
Крылова Т. С. |
Базы данных |
5 |
||
Владимиров В. А. |
Базы данных |
5 |
||
Петров Ф. И. |
Теория информации |
Null |
||
Сидоров К. А. |
Теория информации |
4 |
||
Миронов А. В. |
Теория информации |
Null |
||
Степанова К. Е. |
Теория информации |
2 |
||
Крылова Т. С. |
Теория информации |
5 |
||
Владимиров В. А. |
Теория информации |
Null |
||
Петров Ф. И. |
Английский язык |
5 |
||
Сидоров К. А. |
Английский язык |
Null |
||
Миронов А. В. |
Английский язык |
Null |
||
Степанова К. Е. |
Английский язык |
Null |
||
Крылова Т. С. |
Английский язык |
Null |
||
Владимиров В. А. |
Английский язык |
4 |
||
Трофимов П. А. |
Сети и телекоммуникации |
4 |
||
Иванова Е. А. |
Сети и телекоммуникации |
5 |
||
ФИО |
Дисциплина |
Оценка |
||
Уткина Н. В. |
Сети и телекоммуникации |
5 |
||
Трофимов П. А. |
Английский язык |
5 |
||
Иванова Е. А. |
Английский язык |
3 |
||
Уткина Н. В. |
Английский язык |
Null |
||