Join (SQL)
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 записей.
Этот вид соединения нужно использовать с осторожностью, скорость выполнения растет экспоненциально с ростом количества записей и зачастую содержит избыточную информацию.