Примеры соединений разного вида
Основное назначение приводимых ниже примеров состоит не в том, чтобы продемонстрировать практическую значимость разнообразных соединений, а лишь в том, чтобы помочь в них разобраться.1) Поэтому мы будем использовать упрощенные и формальные таблицы и показывать заголовки и тела результирующих таблиц.
Итак, пусть имеются таблицы table1 (a1, a2, c1, c2) и table2 (b1, b2, c1, c2) со следующими телами:
table1 | |||||||
a1 | a2 | c1 | c2 | ||||
1 | 1 | 1 | 1 | ||||
1 | 1 | 2 | 3 | ||||
1 | 1 | 2 | 3 | ||||
2 | 3 | 4 | NULL | ||||
3 | NULL | NULL | 5 | ||||
table2 |
| ||||||
b1 | b2 | c1 | c2 |
| |||
1 | 1 | 1 | 1 |
| |||
1 | 2 | 2 | 3 |
| |||
3 | 3 | 2 | 3 |
| |||
4 | 4 | 4 | 4 |
| |||
3 | NULL | NULL | 5 |
| |||
3 | NULL | NULL | 5 |
|
Обозначим через JR таблицу, являющуюся результатом соединения. Тогда для операции table1 INNER JOIN table2 ON a1=b1 AND a2<b2 (внутреннее соединение по условию) тело JR будет следующим:
JR | |||||||
a1 | a2 | table1.c1 | table1.c2 | b1 | b2 | table2.c1 | table2.c2 |
1 | 1 | 1 | 1 | 1 | 2 | 2 | 3 |
1 | 1 | 2 | 3 | 1 | 2 | 2 | 3 |
1 | 1 | 2 | 3 | 1 | 2 | 2 | 3 |
Строки-дубликаты появились в JR, поскольку в первом операнде присутствовали строки-дубликаты, удовлетворяющие условию соединения.
Результатом операции table1 INNER JOIN table2 USING (c2) (внутреннее соединение по совпадению значений указанных одноименных столбцов) будет следующая таблица.
JR | ||||||
a1 | a2 | table1.c1 | c2 | b1 | b2 | table2.c1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 2 | 3 | 1 | 2 | 2 |
1 | 1 | 2 | 3 | 3 | 3 | 2 |
1 | 1 | 2 | 3 | 1 | 2 | 2 |
1 | 1 | 2 | 3 | 3 | 3 | 2 |
3 | NULL | NULL | 5 | 3 | NULL | NULL |
3 | NULL | NULL | 5 | 3 | NULL | NULL |
Результат операции table1 INNER JOIN table2 USING (c1,c2):
JR | |||||
a1 | a2 | c1 | c2 | b1 | b2 |
1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 2 | 3 | 1 | 2 |
1 | 1 | 2 | 3 | 3 | 3 |
1 | 1 | 2 | 3 | 1 | 2 |
1 | 1 | 2 | 3 | 3 | 3 |
Такой же результат будет получен при выполнении операции 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 | |||||||
a1 | a2 | table1.c1 | table1.c2 | b1 | b2 | table2.c1 | table2.c2 |
1 | 1 | 1 | 1 | 1 | 2 | 2 | 3 |
1 | 1 | 2 | 3 | 1 | 2 | 2 | 3 |
1 | 1 | 2 | 3 | 1 | 2 | 2 | 3 |
2 | 3 | 4 | NULL | NULL | NULL | NULL | NULL |
3 | NULL | NULL | 5 | NULL | NULL | NULL | NULL |
Как видно, в результате левого внешнего соединения сохраняются все данные первого (левого) операнда.
Результатом операции table1 RIGHT OUTER JOIN table2 ON a1=b1 AND a2<b2 (правое внешнее соединение по условию) будет следующая таблица:
JR | |||||||
a1 | a2 | table1.c1 | table1.c2 | b1 | b2 | table2.c1 | table2.c2 |
1 | 1 | 1 | 1 | 1 | 2 | 2 | 3 |
1 | 1 | 2 | 3 | 1 | 2 | 2 | 3 |
1 | 1 | 2 | 3 | 1 | 2 | 2 | 3 |
NULL | NULL | NULL | NULL | 1 | 1 | 1 | 1 |
NULL | NULL | NULL | NULL | 3 | 3 | 2 | 3 |
NULL | NULL | NULL | NULL | 4 | 4 | 4 | 4 |
NULL | NULL | NULL | NULL | 3 | NULL | NULL | 5 |
NULL | NULL | NULL | NULL | 3 | NULL | NULL | 5 |
Как видно, в результате правого внешнего соединения сохраняются все данные второго (правого) операнда.
Результатом операции table1 FULL OUTER JOIN table2 ON a1=b1 AND a2<b2 (полное внешнее соединение по условию) будет следующая таблица:
JR | |||||||
a1 | a2 | table1.c1 | table1.c2 | b1 | b2 | table2.c1 | table2.c2 |
1 | 1 | 1 | 1 | 1 | 2 | 2 | 3 |
1 | 1 | 2 | 3 | 1 | 2 | 2 | 3 |
1 | 1 | 2 | 3 | 1 | 2 | 2 | 3 |
2 | 3 | 4 | NULL | NULL | NULL | NULL | NULL |
3 | NULL | NULL | 5 | NULL | NULL | NULL | NULL |
NULL | NULL | NULL | NULL | 1 | 1 | 1 | 1 |
NULL | NULL | NULL | NULL | 3 | 3 | 2 | 3 |
NULL | NULL | NULL | NULL | 4 | 4 | 4 | 4 |
NULL | NULL | NULL | NULL | 3 | NULL | NULL | 5 |
NULL | NULL | NULL | NULL | 3 | NULL | NULL | 5 |
Как видно, в результате полного внешнего соединения сохраняются данные обоих операндов. Кстати, полное внешнее соединение иногда называют еще симметричным внешним соединением. Очевидно, что все операции внутреннего соединения и операция полного внешнего соединения коммутативны, а операции левого и правого соединения коммутативными не являются.
Результатом операции table1 LEFT OUTER JOIN table2 USING (c2) (левое внешнее соединение по совпадению значений указанных одноименных столбцов>) будет следующая таблица:
JR | ||||||
a1 | a2 | table1.c1 | c2 | b1 | b2 | table2.c1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 2 | 3 | 1 | 2 | 2 |
1 | 1 | 2 | 3 | 3 | 3 | 2 |
1 | 1 | 2 | 3 | 1 | 2 | 2 |
1 | 1 | 2 | 3 | 3 | 3 | 2 |
3 | NULL | NULL | 5 | 3 | NULL | NULL |
3 | NULL | NULL | 5 | 3 | NULL | NULL |
2 | 3 | 4 | NULL | NULL | NULL | NULL |
Результатом операции table1 RIGHT OUTER JOIN table2 USING (c2) (правое внешнее соединение по совпадению значений указанных одноименных столбцов) будет следующая таблица:
JR | ||||||
a1 | a2 | table1.c1 | c2 | b1 | b2 | table2.c1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 2 | 3 | 1 | 2 | 2 |
1 | 1 | 2 | 3 | 3 | 3 | 2 |
1 | 1 | 2 | 3 | 1 | 2 | 2 |
1 | 1 | 2 | 3 | 3 | 3 | 2 |
3 | NULL | NULL | 5 | 3 | NULL | NULL |
3 | NULL | NULL | 5 | 3 | NULL | NULL |
NULL | NULL | NULL | 4 | 4 | 4 | 4 |
Результатом операции table1 FULL OUTER JOIN table2 USING (c2) (полное внешнее соединение по совпадению значений указанных одноименных столбцов) будет следующая таблица:
JR | ||||||
a1 | a2 | table1.c1 | c2 | b1 | b2 | table2.c1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 2 | 3 | 1 | 2 | 2 |
1 | 1 | 2 | 3 | 3 | 3 | 2 |
1 | 1 | 2 | 3 | 1 | 2 | 2 |
1 | 1 | 2 | 3 | 3 | 3 | 2 |
3 | NULL | NULL | 5 | 3 | NULL | NULL |
3 | NULL | NULL | 5 | 3 | NULL | NULL |
2 | 3 | 4 | NULL | NULL | NULL | NULL |
NULL | NULL | NULL | 4 | 4 | 4 | 4 |
Результатом операции table1 LEFT OUTER JOIN table2 USING (c2, c1) (и операции table1 NATURAL LEFT OUTER JOIN table2 - естественное левое внешнее соединение) будет следующая таблица:
JR | |||||
a1 | a2 | c1 | c2 | b1 | b2 |
1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 2 | 3 | 1 | 2 |
1 | 1 | 2 | 3 | 3 | 3 |
1 | 1 | 2 | 3 | 1 | 2 |
1 | 1 | 2 | 3 | 3 | 3 |
2 | 3 | 4 | NULL | NULL | NULL |
3 | NULL | NULL | 5 | NULL | NULL |
Результатом операции table1 RIGHT OUTER JOIN table2 USING (c2, c1) (и операции table1 NATURAL RIGHT OUTER JOIN table2 - естественное правое внешнее соединение) будет следующая таблица:
JR | |||||
a1 | a2 | c1 | c2 | b1 | b2 |
1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 2 | 3 | 1 | 2 |
1 | 1 | 2 | 3 | 3 | 3 |
1 | 1 | 2 | 3 | 1 | 2 |
1 | 1 | 2 | 3 | 3 | 3 |
NULL | NULL | 4 | 4 | 4 | 4 |
NULL | NULL | NULL | 5 | 3 | NULL |
NULL | NULL | NULL | 5 | 3 | NULL |
Результатом операции table1 FULL OUTER JOIN table2 USING (c2, c1) (и операции table1 NATURAL FULL OUTER JOIN table2 - естественное полное внешнее соединение) будет следующая таблица:
JR | |||||
a1 | a2 | c1 | c2 | b1 | b2 |
1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 2 | 3 | 1 | 2 |
1 | 1 | 2 | 3 | 3 | 3 |
1 | 1 | 2 | 3 | 1 | 2 |
1 | 1 | 2 | 3 | 3 | 3 |
2 | 3 | 4 | NULL | NULL | NULL |
3 | NULL | NULL | 5 | NULL | NULL |
NULL | NULL | 4 | 4 | 4 | 4 |
NULL | NULL | NULL | 5 | 3 | NULL |
NULL | NULL | NULL | 5 | 3 | NULL |
Наконец, результатом операции table1 UNION JOIN table2 (соединение объединением) будет следующая таблица:
JR | |||||||
a1 | a2 | table1.c1 | table1.c2 | b1 | b2 | table2.c1 | table2.c2 |
1 | 1 | 1 | 1 | NULL | NULL | NULL | NULL |
1 | 1 | 2 | 3 | NULL | NULL | NULL | NULL |
1 | 1 | 2 | 3 | NULL | NULL | NULL | NULL |
2 | 3 | 4 | NULL | NULL | NULL | NULL | NULL |
3 | NULL | NULL | 5 | NULL | NULL | NULL | NULL |
NULL | NULL | NULL | NULL | 1 | 1 | 2 | 3 |
NULL | NULL | NULL | NULL | 1 | 2 | 2 | 3 |
NULL | NULL | NULL | NULL | 3 | 3 | 2 | 3 |
NULL | NULL | NULL | NULL | 4 | 4 | 4 | 4 |
NULL | NULL | NULL | NULL | 3 | NULL | NULL | 5 |
NULL | NULL | NULL | NULL | 3 | NULL | NULL | 5 |
- Введение в модель данных sql
- 1. Лекция: Язык баз данных sql: общее введение, типы данных и средства определения доменов Введение
- Краткая история языка sql
- Структура языка sql
- Типы данных sql
- Tочные числовые типы
- Истинно целые типы
- Точные типы, допускающие наличие дробной части
- Приближенные числовые типы
- Типы символьных строк
- Типы битовых строк
- Типы даты и времени
- Тип даты
- Типы времени
- Типы временной метки
- Типы времени и временной метки с временной зоной
- Типы временных интервалов
- Булевский тип
- Типы коллекций
- Типы массивов
- Типы мультимножеств
- Анонимные строчные типы
- Типы, определяемые пользователем
- Ссылочные типы
- Средства определения, изменения определения и отмены определения доменов
- Определение домена
- Примеры определений доменов
- Изменение определения домена
- Примеры изменения определения домена
- Отмена определения домена
- Неявные и явные преобразования типа или домена
- Неявные преобразования типов в sql
- Явные преобразования типов или доменов и оператор cast
- Заключение
- 2. Лекция: Язык баз данных sql: средства определения базовых таблиц и ограничений целостности
- Введение
- Средства определения, изменения и ликвидации базовых таблиц
- Определение базовой таблицы
- Определение столбца
- Значения столбца по умолчанию
- Ограничения целостности столбца
- Определение табличного ограничения
- Табличное ограничение первичного или возможного ключа
- Проверочное табличное ограничение
- Табличное ограничение внешнего ключа
- Разновидности способов сопоставления значений внешнего и возможного ключей
- Поддержка ссылочной целостности и ссылочные действия
- Примеры определений базовых таблиц
- Изменение определения базовой таблицы
- Добавление, изменение или удаление определения столбца
- Примеры изменения определения столбца
- Изменение набора табличных ограничений
- Примеры изменения набора табличных ограничений
- Отмена определения (уничтожение) базовой таблицы
- Средства определения и отмены общих ограничений целостности
- Определение общих ограничений целостности
- Отмена определения общего ограничения целостности
- Немедленная и откладываемая проверка ограничений
- Заключение
- 3. Лекция: Язык баз данных sql: общая характеристика оператора select и организация списка ссылок на таблицы в разделе from
- 4. Лекция: Язык баз данных sql: предикаты раздела where оператора select
- Предикат сравнения
- Примеры запросов с использованием предиката сравнения
- Предикат between
- Примеры запросов с использованием предиката between
- Предикат null
- Примеры запросов с использованием предиката null
- Предикат in
- Примеры запросов с использованием предиката in
- Предикат like
- Примеры запросов с использованием предиката like
- Предикат similar
- Примеры запросов с использованием предиката similar
- Предикат exists
- Примеры запросов с использованием предиката exists
- Предикат unique
- Примеры запросов с использованием предиката unique
- Предикат overlaps
- Примеры запросов с использованием предиката overlaps
- Предикат сравнения с квантором
- Примеры запросов с использованием предиката сравнения с квантором
- Предикат match
- Примеры запросов с использованием предиката match
- Предикат distinct
- Примеры запросов с использованием предиката distinct
- Заключение
- 5. Лекция: Язык баз данных sql: группировка и условия раздела having, порождаемые и соединенные таблицы
- Логические выражения раздела having
- Предикаты сравнения
- Предикат between
- Предикат null
- Предикат in
- Предикат like
- Предикат exists
- Предикат unique
- Предикаты сравнения с квантором
- Предикат distinct
- Более сложные конструкции оператора выборки
- Соединенные таблицы
- Формальные определения
- Примеры соединений разного вида
- Примеры запросов с использованием соединенных таблиц
- 6. Лекция: Язык баз данных sql: средства формулировки аналитических и рекурсивных запросов
- Возможности формулирования аналитических запросов
- Раздел group by rollup
- Агрегатная функция grouping
- Раздел group by cube
- Рекурсивные запросы
- Определения, относящиеся к рекурсии
- Рекурсивные запросы с разделом with
- Раздел search
- Раздел cyrcle
- Рекурсивные представления
- Заключение
- 7. Лекция: Язык баз данных sql: средства манипулирования данными
- Введение
- Базовые средства манипулирования данными
- Оператор insert для вставки строк в существующие таблицы
- Вставка всех строк указанной таблицы
- Вставка явно заданного набора строк
- Вставка строк результата запроса
- Оператор update для модификации существующих строк в существующих таблицах
- Оператор delete для удаления строк в существующих таблицах
- Представления, над которыми возможны операции обновления
- Представления, допускающие применение операций обновления, в стандарте sql/92
- Представления, допускающие применение операций обновления, в стандарте sql:1999
- Критерии применимости операций обновления
- Правила функциональных зависимостей
- Раздел with check option определения представления
- Режимы проверки cascaded и local
- Примеры результатов действия раздела with check option
- Исторический очерк