Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

2008 г.

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

Сергей Кузнецов

Назад Содержание Вперёд

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

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

Итак, пусть имеются таблицы 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


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

Назад Содержание Вперёд

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...