Базы данных. Вводный курс

Примеры соединений разного вида


Основное назначение приводимых ниже примеров состоит не в том, чтобы продемонстрировать практическую значимость разнообразных соединений, а лишь в том, чтобы помочь в них разобраться. Поэтому мы будем использовать упрощенные и формальные таблицы и показывать заголовки и тела результирующих таблиц.

Итак, пусть имеются таблицы table1 (a1, a2, c1, c2) и table2 (b1, b2, c1, c2) со следующими телами:

table1
a1a2c1c2
1111
1123
1123
234NULL
3NULLNULL5

table2
b1b2c1c2
1111
1223
3323
4444
3NULLNULL5
3NULLNULL5

Обозначим через JR таблицу, являющуюся результатом соединения. Тогда для операции table1 INNER JOIN table2 ON a1=b1 AND a2<b2 (внутреннее соединение по условию) тело JR будет следующим:

JR
a1a2table1.c1table1.c2b1b2table2.c1table2.c2
11111223
11231223
11231223

Строки-дубликаты появились в JR, поскольку в первом операнде присутствовали строки-дубликаты, удовлетворяющие условию соединения.

Результатом операции table1 INNER JOIN table2 USING (c2) (внутреннее соединение по совпадению значений указанных одноименных столбцов) будет следующая таблица.

JR
a1a2table1.c1c2b1b2table2.c1
1111111
1123122
1123332
1123122
1123332
3NULLNULL53NULLNULL
3NULLNULL53NULLNULL

Результат операции table1 INNER JOIN table2 USING (c1,c2):

JR
a1a2c1c2b1b2
111111
112312
112333
112312
112333

Такой же результат будет получен при выполнении операции table1 NATURAL INNER JOIN table2 (естественное внутреннее соединение). Более того, для произвольных таблиц table1 и table2 результаты операций table1 INNER JOIN table2 USING (с1, c2, ...cn) и table1 INNER NATURAL JOIN table2 совпадают в том и только в том случае, когда список имен столбцов с1, c2, ...cn включает все имена столбцов, общие для таблиц table1 и table2.

Результатом операции table1 LEFT OUTER JOIN table2 ON a1=b1 AND a2<b2 (левое внешнее соединение по условию>) будет следующая таблица:

JR
a1a2table1.c1table1.c2b1b2table2.c1table2.c2
11111223
11231223
11231223
234NULLNULLNULLNULLNULL
3NULLNULL5NULLNULLNULLNULL


Как видно, в результате левого внешнего соединения сохраняются все данные первого (левого) операнда.
Результатом операции table1 RIGHT OUTER JOIN table2 ON a1=b1 AND a2<b2 (правое внешнее соединение по условию) будет следующая таблица: JR
a1a2table1.c1table1.c2b1b2table2.c1table2.c2
11111223
11231223
11231223
NULLNULLNULLNULL1111
NULLNULLNULLNULL3323
NULLNULLNULLNULL4444
NULLNULLNULLNULL3NULLNULL5
NULLNULLNULLNULL3NULLNULL5

Как видно, в результате правого внешнего соединения сохраняются все данные второго (правого) операнда.
Результатом операции table1 FULL OUTER JOIN table2 ON a1=b1 AND a2<b2 (полное внешнее соединение по условию) будет следующая таблица: JR
a1a2table1.c1table1.c2b1b2table2.c1table2.c2
11111223
11231223
11231223
234NULLNULLNULLNULLNULL
3NULLNULL5NULLNULLNULLNULL
NULLNULLNULLNULL1111
NULLNULLNULLNULL3323
NULLNULLNULLNULL4444
NULLNULLNULLNULL3NULLNULL5
NULLNULLNULLNULL3NULLNULL5

Как видно, в результате полного внешнего соединения сохраняются данные обоих операндов. Кстати, полное внешнее соединение иногда называют еще симметричным внешним соединением. Очевидно, что все операции внутреннего соединения и операция полного внешнего соединения коммутативны, а операции левого и правого соединения коммутативными не являются.
Результатом операции table1 LEFT OUTER JOIN table2 USING (c2) (левое внешнее соединение по совпадению значений указанных одноименных столбцов>) будет следующая таблица: JR
a1a2table1.c1c2b1b2table2.c1
1111111
1123122
1123332
1123122
1123332
3NULLNULL53NULLNULL
3NULLNULL53NULLNULL
234NULLNULLNULLNULL

Результатом операции table1 RIGHT OUTER JOIN table2 USING (c2) (правое внешнее соединение по совпадению значений указанных одноименных столбцов) будет следующая таблица: JR
a1a2table1.c1c2b1b2table2.c1
1111111
1123122
1123332
1123122
1123332
3NULLNULL53NULLNULL
3NULLNULL53NULLNULL
NULLNULLNULL4444

Результатом операции table1 FULL OUTER JOIN table2 USING (c2) (полное внешнее соединение по совпадению значений указанных одноименных столбцов) будет следующая таблица: JR
a1a2table1.c1c2b1b2table2.c1
1111111
1123122
1123332
1123122
1123332
3NULLNULL53NULLNULL
3NULLNULL53NULLNULL
234NULLNULLNULLNULL
NULLNULLNULL4444

Результатом операции table1 LEFT OUTER JOIN table2 USING (c2, c1) (и операции table1 NATURAL LEFT OUTER JOIN table2 – естественное левое внешнее соединение) будет следующая таблица: JR
a1a2c1c2b1b2
111111
112312
112333
112312
112333
234NULLNULLNULL
3NULLNULL5NULLNULL

Результатом операции table1 RIGHT OUTER JOIN table2 USING (c2, c1) (и операции table1 NATURAL RIGHT OUTER JOIN table2 – естественное правое внешнее соединение) будет следующая таблица: JR
a1a2c1c2b1b2
111111
112312
112333
112312
112333
NULLNULL4444
NULLNULLNULL53NULL
NULLNULLNULL53NULL

Результатом операции table1 FULL OUTER JOIN table2 USING (c2, c1) (и операции table1 NATURAL FULL OUTER JOIN table2 – естественное полное внешнее соединение) будет следующая таблица: JR
a1a2c1c2b1b2
111111
112312
112333
112312
112333
234NULLNULLNULL
3NULLNULL5NULLNULL
NULLNULL4444
NULLNULLNULL53NULL
NULLNULLNULL53NULL

Наконец, результатом операции table1 UNION JOIN table2 (соединение объединением) будет следующая таблица: JR
a1a2table1.c1table1.c2b1b2table2.c1table2.c2
1111NULLNULLNULLNULL
1123NULLNULLNULLNULL
1123NULLNULLNULLNULL
234NULLNULLNULLNULLNULL
3NULLNULL5NULLNULLNULLNULL
NULLNULLNULLNULL1123
NULLNULLNULLNULL1223
NULLNULLNULLNULL3323
NULLNULLNULLNULL4444
NULLNULLNULLNULL3NULLNULL5
NULLNULLNULLNULL3NULLNULL5

  За очевидностью мы опустим примерCROSS JOIN.

Содержание раздела