Join (SQL)

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая Streamer000 (обсуждение | вклад) в 03:21, 21 февраля 2010 (создание статьи). Она может серьёзно отличаться от текущей версии.
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

JOIN - оператор языка SQL, позволяющий включить данные из нескольких таблиц. Входит в оператор FROM и отдельно от него не используется.

Описание оператора

select field [,... n]
from MainTable
{inner | {left | right | cross} outer | cross } join JoinTable on <condition>

В большинстве СУБД при указании слов left, right, cross слово outer можно опустить.

В общем случае СУБД проверяет условие condition, на соответствие в соединяемой таблице (JoinTable). Для cross join условие не указывается.

Для cross join'a в некоторых реализациях SQL используется такой вид оператора:

select field [,... n]
from MainTable, JoinTable

или

select field [,... n]
from MainTable
from JoinTable

Виды оператора JOIN

Оператор JOIN может использоваться с различными опциями:

  • inner join (по умолчанию)
  • outer join
    • left outer join
    • right outer join
    • full outer join
  • cross join

Для пояснений будет использоваться следующие таблицы:

Люди проживающие в городах

Name CityId
Андрей 1
Леонид 2
Сергей 1
Григорий 4

Города

Id Name
1 Москва
2 Санкт-Петербург
3 Казань

INNER JOIN

Объединяет две таблицы, где каждая строка обоих таблиц в точности соответствует условию. Если для строки одной таблицы не найдено соответствия в другой таблице, строка не включается в набор.

select * 
from Person
left outer join City on Person.CityId = City.Id
Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва

Выбор по первичному ключу и индексу положительно сказывается на скорости выборки.

OUTER JOIN

Присоединение таблицы с необязательным присутствием записи в таблице. Также как и в случае с inner join условие по индекированным полям и первичному ключу ускоряет все виды outer join'ов.

LEFT OUTER JOIN

К левой таблице присоединяются все записи из правой соответствующие условию (по правилам inner join) плюс все не вошедшие записи из левой таблицы, поля правой таблицы заполняются значениями NULL.


select * 
from Person
left outer join City on Person.CityId = City.Id
Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва
Григорий 4 NULL NULL

RIGHT OUTER JOIN

Аналогично left outer join, но применяется для правой таблицы.

К левой таблице присоединяются все записи из правой соответствующие условию (по правилам inner join) плюс все не вошедшие записи из правой таблицы, поля левой таблицы заполняются значениями NULL.


select * 
from Person
right outer join City on Person.CityId = City.Id
Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва
NULL NULL 3 Казань

FULL OUTER JOIN

К левой таблице присоединяются все записи из правой соответствующие условию (по правилам inner join) плюс все не вошедшие записи из правой таблицы, поля левой таблицы заполняются значениями NULL и плюс все не вошедшие записи из левой таблицы, поля правой таблицы заполняются значениями NULL

select * 
from Person
full outer join City on Person.CityId = City.Id
Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва
Григорий 4 NULL NULL
NULL NULL 3 Казань

CROSS JOIN

Все возможные сочетания из обоих таблиц. Как уже говорилось выше условие для этого типа оператора JOIN не указывается.

select * 
from Person
cross join City

или

select * 
from Person, City

Набор очевиден и содержит для данного случая 16 записей.

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