Объединение наборов данных
Существует возможность выборки данных из разных источников с объединением их полей. В SQL этот процесс формально называется объединением (join).
В результате объединения двух или более наборов данных создается новыйнабор записей, состоящих из всех полей исходных наборов. Базовый вариант объединения представляет собой декартово произведение, то есть совокупность всех возможных комбинаций двух наборов. Далее из этого произведения отбирается часть записей по критериям, заданным в секции JOIN.
Существуют три разновидности объединений.
– Перекрестные объединения (CROSS JOIN). Декартово (перекрестное) произведение двух наборов данных. Произведение не определяет отношений между наборами, а лишь содержит все возможные комбинации записей объединяемых наборов.
– Внутренние объединения (INNER JOIN). Подмножество декартова произведения двух наборов данных с критерием, используемым для объединения записей. Критерий возвращает логическую величину — признак вхождения записи в объединенный набор.
– Внешние объединения (OUTER JOIN). Как и внутренние объединения, содержат критерий объединения записей, но обязательно возвращают минимум один экземпляр каждой записи заданного набора. Это может быть левый набор (источник данных слева от ключевого слова JOIN), правый набор (источник данных справа от ключевого слова JOIN) или оба набора в зависимости от конкретной разновидности внешнего объединения. Пустые поля в тех частях записей, которые не отвечают критерию объединения, содержат NULL.
На практике чаще используются внутренние и внешние объединения, при которых секция JOIN обязательно содержит критерий, уточняющий связи между объединяемыми наборами данных. Поэтому рассмотрим их более бодробно. Синтаксис внутренних и внешних объединений:
источник1 тип_объединения источник2 [ 0N ( условие [. .] )
– источник1. Первый из объединяемых наборов данных (имя таблицы или подзапрос).
– тип_объединения. В данном контексте допустимы следующие типы объединений: [INNER] JOIN (то есть JOIN без уточнения подразумевает INNER JOIN), LEET [OUTER] JOIN, RIGHT [OUTER] JOIN и FULL [OUTER] JOIN.
– источник2. Второй из объединяемых наборов данных (имя таблицы или подзапрос).
– ON ( условие [. .. ] ). Отношение между источниками. В секции ON можно задать произвольный критерий по аналогии с тем, как задаются условия в секции WHERE. В критерии могут использоваться синонимы таблиц и полей.
Внутренние объединения
Для примера найдем всех служащих, которые работают в офисах компании:
SELECT *
FROM zakazy.offisy o
JOIN zakazy.sluzhaschie s on o.id_ofc = s.id_ofc
Результат выполнения запроса:
| Рис. 18. Результат выполнения запроса внутреннего объединения
|
Аналогичного результата можно достигнуть, если выполнить следующий запрос:
SELECT *
FROM zakazy.offisy o, zakazy.sluzhaschie s
WHERE o.id_ofc = s.id_ofc
Две синтаксические формы запросов функционально идентичны и возвращают одинаковые результаты. Синтаксис INNER JOIN позволяет отделить критерий связи источников от критерия выбора записей, поскольку связи определяются только в секции ON. Это существенно упрощает чтение и модификацию запросов, поскольку программисту не приходится разбираться в смысле каждого условия в секции WHERE.
Внешние объединения
При внутреннем объединении все записи, для которых не находится соответствующего значения в других наборах (заданных при помощи ON), просто игнорируются.
С другой стороны, внешнее объединение может сохранить записи, для которых не находится соответствия в других наборах. В этом случае недостающие поля заполняются значениями NULL. Решение о том, войдет ли такая запись во внешнее объединение, зависит от того, в каком из объединяемых наборов отсутствуют данные, и от типа внешнего объединения. » Существуют три разновидности внешних объединений.
– Левое внешнее объединение. Всегда содержит как минимум один экземпляр каждой записи из набора, указанного слева от ключевого слова JOIN. Отсутствующие поля из правого набора заполняются значениями NULL.
SELECT *
FROM zakazy.offisy o
LEFT JOIN zakazy.sluzhaschie s on o.id_ofc = s.id_ofc
Результат выполнения запроса:
| Рис. 19. Результат выполнения запроса левого внешнего объединения
| – Правое внешнее объединение. Всегда содержит как минимум один экземпляр каждой записи из набора, указанного справа от ключевого слова JOIN. Отсутствующие поля из левого набора заполняются значениями NULL.
| Рис. 20. Результат выполнения запроса правого внешнего объединения
| SELECT *
FROM zakazy.offisy o
RIGHT JOIN zakazy.sluzhaschie s on o.id_ofc = s.id_ofc
Результат выполнения запроса:
| Рис. 21. Результат выполнения запроса полного внешнего объединения
| – Полное внешнее объединение. Всегда содержит как минимум один экземпляр каждой записи каждого объединяемого набора. Отсутствующие поля в записях нового набора заполняются значениями NULL.
SELECT *
FROM zakazy.offisy o
FULL JOIN zakazy.sluzhaschie s on o.id_ofc = s.id_ofc
Результат выполнения запроса:
Выполнение функций
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|