Join (SQL)JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в предложение FROM операторов SELECT, UPDATE и DELETE. Операция соединения, как и другие бинарные операции, предназначена для обеспечения выборки данных из двух таблиц и включения этих данных в один результирующий набор. Отличительными особенностями операции соединения являются следующие:
Определение того, какие именно исходные строки войдут в результат и в каких сочетаниях, зависит от типа операции соединения и от явно заданного условия соединения. Условие соединения, то есть условие сопоставления строк исходных таблиц друг с другом, представляет собой логическое выражение (предикат). При необходимости соединения не двух, а нескольких таблиц, операция соединения применяется несколько раз (последовательно). SQL-операция JOIN является реализацией операции соединения реляционной алгебры только в некотором приближении, поскольку в реляционной модели данных соединение выполняется над отношениями, которые являются множествами, а в SQL — над таблицами, которые являются мультимножествами. Результаты операций тоже, в общем случае, различны: в реляционной алгебре результат соединения даёт отношение (множество), а в SQL — таблицу (мультимножество). Описание оператораFROM
Table1
{INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN
Table2
{ON <condition> | USING (field_name [,... n])}
В большинстве СУБД при указании слов В общем случае СУБД при выполнении соединения проверяет условие (предикат) condition. Если названия столбцов, по которым происходит соединение таблиц, совпадают, то вместо Для перекрёстного соединения (декартова произведения) FROM
Table1,
Table2
Виды оператора JOINДля дальнейших пояснений будут использоваться следующие таблицы:
INNER JOINОператор внутреннего соединения Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц. Тело результата логически формируется следующим образом. Каждая строка одной таблицы сопоставляется с каждой строкой второй таблицы, после чего для полученной «соединённой» строки проверяется условие соединения (вычисляется предикат соединения). Если условие истинно, в таблицу-результат добавляется соответствующая «соединённая» строка. Описанный алгоритм действий является строго логическим, то есть он лишь объясняет результат, который должен получиться при выполнении операции, но не предписывает, чтобы конкретная СУБД выполняла соединение именно указанным образом. Существует несколько способов реализации операции соединения, например, соединение вложенными циклами (англ. inner loops join), соединение хешированием (англ. hash join), соединение слиянием (англ. merge join). Единственное требование состоит в том, чтобы любая реализация логически давала такой же результат, как при применении описанного алгоритма. SELECT *
FROM
Person
INNER JOIN
City
ON Person.CityId = City.Id
Результат:
OUTER JOINСоединение двух таблиц, в результат которого обязательно входят все строки либо одной, либо обеих таблиц. LEFT OUTER JOINОператор левого внешнего соединения Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц. Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.
SELECT *
FROM
Person -- Левая таблица
LEFT OUTER JOIN
City -- Правая таблица
ON Person.CityId = City.Id
Результат:
RIGHT OUTER JOINОператор правого внешнего соединения Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц. Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.
SELECT *
FROM
Person -- Левая таблица
RIGHT OUTER JOIN
City -- Правая таблица
ON Person.CityId = City.Id
Результат:
FULL OUTER JOINОператор полного внешнего соединения Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц. Тело результата логически формируется следующим образом. Пусть выполняется соединение первой и второй таблиц по предикату (условию) p. Слова «первой» и «второй» здесь не обозначают порядок в записи выражения (который неважен), а используются лишь для различения таблиц.
SELECT *
FROM
Person
FULL OUTER JOIN
City
ON Person.CityId = City.Id
Результат:
CROSS JOINОператор перекрёстного соединения, или декартова произведения Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц. Тело результата логически формируется следующим образом. Каждая строка одной таблицы соединяется с каждой строкой второй таблицы, давая тем самым в результате все возможные сочетания строк двух таблиц. SELECT *
FROM
Person
CROSS JOIN
City
или SELECT *
FROM
Person,
City
Результат:
Если в предложении WHERE добавить условие соединения (предикат p), то есть ограничения на сочетания кортежей, то результат эквивалентен операции SELECT *
FROM
Person,
City
WHERE
Person.CityId = City.Id
Таким образом, выражения Примечания
Ссылки
|