Join (SQL). Sql join оператор


Join (SQL) - это... Что такое Join (SQL)?

У этого термина существуют и другие значения, см. Join. Правильный заголовок этой статьи — JOIN. Он показан некорректно из-за технических ограничений.

JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в раздел FROM операторов SELECT, UPDATE или DELETE.

Операция соединения, как и другие бинарные операции, предназначена для обеспечения выборки данных из двух таблиц и включения этих данных в один результирующий набор. Отличительной особенностью операции соединения является следующее:

  • в схему таблицы-результата входят столбцы обеих исходных таблиц (таблиц-операндов), то есть схема результата является «сцеплением» схем операндов;
  • каждая строка таблицы-результата является «сцеплением» строки из одной таблицы-операнда со строкой второй таблицы-операнда.

Определение того, какие именно исходные строки войдут в результат и в каких сочетаниях, зависит от типа операции соединения и от явно заданного условия соединения. Условие соединения, то есть условие сопоставления строк исходных таблиц друг с другом, представляет собой логическое выражение (предикат).

При необходимости соединения не двух, а нескольких таблиц, операция соединения применяется несколько раз (последовательно).

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

SELECT FIELD [,... n] FROM Table1 {INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN Table2 ON <condition>

В большинстве СУБД при указании слов LEFT, RIGHT, FULL слово OUTER можно опустить. Слово INNER также в большинстве СУБД можно опустить.

В общем случае СУБД при выполнении соединения проверяет условие (предикат) condition. Для CROSS JOIN условие не указывается.

Для перекрёстного соединения (декартова произведения) CROSS JOIN в некоторых реализациях SQL используется оператор «запятая» (,):

SELECT FIELD [,... n] FROM Table1, Table2

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

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

Люди, проживающие в городах (таблица Person)

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

Города (таблица City)

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

INNER JOIN

Оператор внутреннего соединения INNER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы сопоставляется с каждой строкой второй таблицы, после чего для полученной «соединённой» строки проверяется условие соединения (вычисляется предикат соединения). Если условие истинно, в таблицу-результат добавляется соответствующая «соединённая» строка.

Описанный алгоритм действий является строго логическим, то есть он лишь объясняет результат, который должен получиться при выполнении операции, но не предписывает, чтобы конкретная СУБД выполняла соединение именно указанным образом. Существует множество способов реализации операции соединения, например соединение вложенными циклами (англ. inner loops join), соединение хэшированием (англ. hash join), соединение слиянием (англ. merge join). Единственное требование состоит в том, чтобы любая реализация логически давала такой же результат, как при применении описанного алгоритма.

SELECT * FROM Person INNER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва

OUTER JOIN

Соединение двух таблиц, в результат которого в обязательном порядке входят строки либо одной, либо обеих таблиц.

LEFT OUTER JOIN

Оператор левого внешнего соединения LEFT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи левой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие правой таблице, заполняются значениями 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

Оператор правого внешнего соединения RIGHT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи правой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие левой таблице, заполняются значениями NULL.
SELECT * FROM Person RIGHT OUTER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Сергей 1 1 Москва
Леонид 2 2 Санкт-Петербург
NULL NULL 3 Казань
FULL OUTER JOIN

Оператор полного внешнего соединения FULL OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение первой и второй таблиц по предикату (условию) p. Слова «первой» и «второй» здесь не обозначают порядок в записи (который неважен), а используются лишь для различения таблиц.

  1. В результат включается внутреннее соединение (INNER JOIN) первой и второй таблиц по предикату p.
  2. В результат добавляются те записи первой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие второй таблице, заполняются значениями NULL.
  3. В результат добавляются те записи второй таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие первой таблице, заполняются значениями NULL.
SELECT * FROM Person FULL OUTER JOIN City ON Person.CityId = City.Id

Результат:

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

CROSS JOIN

Оператор перекрёстного соединения, или декартова произведения CROSS JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы соединяется с каждой строкой второй таблицы, давая тем самым в результате все возможные сочетания строк двух таблиц.

SELECT * FROM Person CROSS JOIN City

или

SELECT * FROM Person, City

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Андрей 1 2 Санкт-Петербург
Андрей 1 3 Казань
Леонид 2 1 Москва
Леонид 2 2 Санкт-Петербург
Леонид 2 3 Казань
Сергей 1 1 Москва
Сергей 1 2 Санкт-Петербург
Сергей 1 3 Казань
Григорий 4 1 Москва
Григорий 4 2 Санкт-Петербург
Григорий 4 3 Казань

Если в предложении WHERE добавить условие соединения, то есть ограничения на сочетания кортежей, то результат эквивалентен операции INNER JOIN с таким же условием:

SELECT * FROM Person, City WHERE Person.CityId = City.Id

Таким образом, CROSS JOIN + WHERE(предикат) и INNER JOIN(предикат) синтаксически являются альтернативными формами записи одной и той же логической операции внутреннего соединения. Синтаксис CROSS JOIN + WHERE для операции соединения называют устаревшим,[1][2] поскольку его не рекомендует стандарт SQL ANSI.

Примечания

Ссылки

dvc.academic.ru

Join (SQL) - это... Что такое Join (SQL)?

У этого термина существуют и другие значения, см. Join. Правильный заголовок этой статьи — JOIN. Он показан некорректно из-за технических ограничений.

JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в раздел FROM операторов SELECT, UPDATE или DELETE.

Операция соединения, как и другие бинарные операции, предназначена для обеспечения выборки данных из двух таблиц и включения этих данных в один результирующий набор. Отличительной особенностью операции соединения является следующее:

  • в схему таблицы-результата входят столбцы обеих исходных таблиц (таблиц-операндов), то есть схема результата является «сцеплением» схем операндов;
  • каждая строка таблицы-результата является «сцеплением» строки из одной таблицы-операнда со строкой второй таблицы-операнда.

Определение того, какие именно исходные строки войдут в результат и в каких сочетаниях, зависит от типа операции соединения и от явно заданного условия соединения. Условие соединения, то есть условие сопоставления строк исходных таблиц друг с другом, представляет собой логическое выражение (предикат).

При необходимости соединения не двух, а нескольких таблиц, операция соединения применяется несколько раз (последовательно).

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

SELECT FIELD [,... n] FROM Table1 {INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN Table2 ON <condition>

В большинстве СУБД при указании слов LEFT, RIGHT, FULL слово OUTER можно опустить. Слово INNER также в большинстве СУБД можно опустить.

В общем случае СУБД при выполнении соединения проверяет условие (предикат) condition. Для CROSS JOIN условие не указывается.

Для перекрёстного соединения (декартова произведения) CROSS JOIN в некоторых реализациях SQL используется оператор «запятая» (,):

SELECT FIELD [,... n] FROM Table1, Table2

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

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

Люди, проживающие в городах (таблица Person)

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

Города (таблица City)

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

INNER JOIN

Оператор внутреннего соединения INNER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы сопоставляется с каждой строкой второй таблицы, после чего для полученной «соединённой» строки проверяется условие соединения (вычисляется предикат соединения). Если условие истинно, в таблицу-результат добавляется соответствующая «соединённая» строка.

Описанный алгоритм действий является строго логическим, то есть он лишь объясняет результат, который должен получиться при выполнении операции, но не предписывает, чтобы конкретная СУБД выполняла соединение именно указанным образом. Существует множество способов реализации операции соединения, например соединение вложенными циклами (англ. inner loops join), соединение хэшированием (англ. hash join), соединение слиянием (англ. merge join). Единственное требование состоит в том, чтобы любая реализация логически давала такой же результат, как при применении описанного алгоритма.

SELECT * FROM Person INNER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва

OUTER JOIN

Соединение двух таблиц, в результат которого в обязательном порядке входят строки либо одной, либо обеих таблиц.

LEFT OUTER JOIN

Оператор левого внешнего соединения LEFT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи левой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие правой таблице, заполняются значениями 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

Оператор правого внешнего соединения RIGHT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи правой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие левой таблице, заполняются значениями NULL.
SELECT * FROM Person RIGHT OUTER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Сергей 1 1 Москва
Леонид 2 2 Санкт-Петербург
NULL NULL 3 Казань
FULL OUTER JOIN

Оператор полного внешнего соединения FULL OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение первой и второй таблиц по предикату (условию) p. Слова «первой» и «второй» здесь не обозначают порядок в записи (который неважен), а используются лишь для различения таблиц.

  1. В результат включается внутреннее соединение (INNER JOIN) первой и второй таблиц по предикату p.
  2. В результат добавляются те записи первой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие второй таблице, заполняются значениями NULL.
  3. В результат добавляются те записи второй таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие первой таблице, заполняются значениями NULL.
SELECT * FROM Person FULL OUTER JOIN City ON Person.CityId = City.Id

Результат:

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

CROSS JOIN

Оператор перекрёстного соединения, или декартова произведения CROSS JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы соединяется с каждой строкой второй таблицы, давая тем самым в результате все возможные сочетания строк двух таблиц.

SELECT * FROM Person CROSS JOIN City

или

SELECT * FROM Person, City

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Андрей 1 2 Санкт-Петербург
Андрей 1 3 Казань
Леонид 2 1 Москва
Леонид 2 2 Санкт-Петербург
Леонид 2 3 Казань
Сергей 1 1 Москва
Сергей 1 2 Санкт-Петербург
Сергей 1 3 Казань
Григорий 4 1 Москва
Григорий 4 2 Санкт-Петербург
Григорий 4 3 Казань

Если в предложении WHERE добавить условие соединения, то есть ограничения на сочетания кортежей, то результат эквивалентен операции INNER JOIN с таким же условием:

SELECT * FROM Person, City WHERE Person.CityId = City.Id

Таким образом, CROSS JOIN + WHERE(предикат) и INNER JOIN(предикат) синтаксически являются альтернативными формами записи одной и той же логической операции внутреннего соединения. Синтаксис CROSS JOIN + WHERE для операции соединения называют устаревшим,[1][2] поскольку его не рекомендует стандарт SQL ANSI.

Примечания

Ссылки

veter.academic.ru

Join (SQL) - это... Что такое Join (SQL)?

У этого термина существуют и другие значения, см. Join. Правильный заголовок этой статьи — JOIN. Он показан некорректно из-за технических ограничений.

JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в раздел FROM операторов SELECT, UPDATE или DELETE.

Операция соединения, как и другие бинарные операции, предназначена для обеспечения выборки данных из двух таблиц и включения этих данных в один результирующий набор. Отличительной особенностью операции соединения является следующее:

  • в схему таблицы-результата входят столбцы обеих исходных таблиц (таблиц-операндов), то есть схема результата является «сцеплением» схем операндов;
  • каждая строка таблицы-результата является «сцеплением» строки из одной таблицы-операнда со строкой второй таблицы-операнда.

Определение того, какие именно исходные строки войдут в результат и в каких сочетаниях, зависит от типа операции соединения и от явно заданного условия соединения. Условие соединения, то есть условие сопоставления строк исходных таблиц друг с другом, представляет собой логическое выражение (предикат).

При необходимости соединения не двух, а нескольких таблиц, операция соединения применяется несколько раз (последовательно).

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

SELECT FIELD [,... n] FROM Table1 {INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN Table2 ON <condition>

В большинстве СУБД при указании слов LEFT, RIGHT, FULL слово OUTER можно опустить. Слово INNER также в большинстве СУБД можно опустить.

В общем случае СУБД при выполнении соединения проверяет условие (предикат) condition. Для CROSS JOIN условие не указывается.

Для перекрёстного соединения (декартова произведения) CROSS JOIN в некоторых реализациях SQL используется оператор «запятая» (,):

SELECT FIELD [,... n] FROM Table1, Table2

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

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

Люди, проживающие в городах (таблица Person)

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

Города (таблица City)

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

INNER JOIN

Оператор внутреннего соединения INNER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы сопоставляется с каждой строкой второй таблицы, после чего для полученной «соединённой» строки проверяется условие соединения (вычисляется предикат соединения). Если условие истинно, в таблицу-результат добавляется соответствующая «соединённая» строка.

Описанный алгоритм действий является строго логическим, то есть он лишь объясняет результат, который должен получиться при выполнении операции, но не предписывает, чтобы конкретная СУБД выполняла соединение именно указанным образом. Существует множество способов реализации операции соединения, например соединение вложенными циклами (англ. inner loops join), соединение хэшированием (англ. hash join), соединение слиянием (англ. merge join). Единственное требование состоит в том, чтобы любая реализация логически давала такой же результат, как при применении описанного алгоритма.

SELECT * FROM Person INNER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва

OUTER JOIN

Соединение двух таблиц, в результат которого в обязательном порядке входят строки либо одной, либо обеих таблиц.

LEFT OUTER JOIN

Оператор левого внешнего соединения LEFT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи левой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие правой таблице, заполняются значениями 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

Оператор правого внешнего соединения RIGHT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи правой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие левой таблице, заполняются значениями NULL.
SELECT * FROM Person RIGHT OUTER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Сергей 1 1 Москва
Леонид 2 2 Санкт-Петербург
NULL NULL 3 Казань
FULL OUTER JOIN

Оператор полного внешнего соединения FULL OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение первой и второй таблиц по предикату (условию) p. Слова «первой» и «второй» здесь не обозначают порядок в записи (который неважен), а используются лишь для различения таблиц.

  1. В результат включается внутреннее соединение (INNER JOIN) первой и второй таблиц по предикату p.
  2. В результат добавляются те записи первой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие второй таблице, заполняются значениями NULL.
  3. В результат добавляются те записи второй таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие первой таблице, заполняются значениями NULL.
SELECT * FROM Person FULL OUTER JOIN City ON Person.CityId = City.Id

Результат:

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

CROSS JOIN

Оператор перекрёстного соединения, или декартова произведения CROSS JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы соединяется с каждой строкой второй таблицы, давая тем самым в результате все возможные сочетания строк двух таблиц.

SELECT * FROM Person CROSS JOIN City

или

SELECT * FROM Person, City

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Андрей 1 2 Санкт-Петербург
Андрей 1 3 Казань
Леонид 2 1 Москва
Леонид 2 2 Санкт-Петербург
Леонид 2 3 Казань
Сергей 1 1 Москва
Сергей 1 2 Санкт-Петербург
Сергей 1 3 Казань
Григорий 4 1 Москва
Григорий 4 2 Санкт-Петербург
Григорий 4 3 Казань

Если в предложении WHERE добавить условие соединения, то есть ограничения на сочетания кортежей, то результат эквивалентен операции INNER JOIN с таким же условием:

SELECT * FROM Person, City WHERE Person.CityId = City.Id

Таким образом, CROSS JOIN + WHERE(предикат) и INNER JOIN(предикат) синтаксически являются альтернативными формами записи одной и той же логической операции внутреннего соединения. Синтаксис CROSS JOIN + WHERE для операции соединения называют устаревшим,[1][2] поскольку его не рекомендует стандарт SQL ANSI.

Примечания

Ссылки

med.academic.ru

Join (SQL) - это... Что такое Join (SQL)?

У этого термина существуют и другие значения, см. Join. Правильный заголовок этой статьи — JOIN. Он показан некорректно из-за технических ограничений.

JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в раздел FROM операторов SELECT, UPDATE или DELETE.

Операция соединения, как и другие бинарные операции, предназначена для обеспечения выборки данных из двух таблиц и включения этих данных в один результирующий набор. Отличительной особенностью операции соединения является следующее:

  • в схему таблицы-результата входят столбцы обеих исходных таблиц (таблиц-операндов), то есть схема результата является «сцеплением» схем операндов;
  • каждая строка таблицы-результата является «сцеплением» строки из одной таблицы-операнда со строкой второй таблицы-операнда.

Определение того, какие именно исходные строки войдут в результат и в каких сочетаниях, зависит от типа операции соединения и от явно заданного условия соединения. Условие соединения, то есть условие сопоставления строк исходных таблиц друг с другом, представляет собой логическое выражение (предикат).

При необходимости соединения не двух, а нескольких таблиц, операция соединения применяется несколько раз (последовательно).

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

SELECT FIELD [,... n] FROM Table1 {INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN Table2 ON <condition>

В большинстве СУБД при указании слов LEFT, RIGHT, FULL слово OUTER можно опустить. Слово INNER также в большинстве СУБД можно опустить.

В общем случае СУБД при выполнении соединения проверяет условие (предикат) condition. Для CROSS JOIN условие не указывается.

Для перекрёстного соединения (декартова произведения) CROSS JOIN в некоторых реализациях SQL используется оператор «запятая» (,):

SELECT FIELD [,... n] FROM Table1, Table2

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

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

Люди, проживающие в городах (таблица Person)

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

Города (таблица City)

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

INNER JOIN

Оператор внутреннего соединения INNER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы сопоставляется с каждой строкой второй таблицы, после чего для полученной «соединённой» строки проверяется условие соединения (вычисляется предикат соединения). Если условие истинно, в таблицу-результат добавляется соответствующая «соединённая» строка.

Описанный алгоритм действий является строго логическим, то есть он лишь объясняет результат, который должен получиться при выполнении операции, но не предписывает, чтобы конкретная СУБД выполняла соединение именно указанным образом. Существует множество способов реализации операции соединения, например соединение вложенными циклами (англ. inner loops join), соединение хэшированием (англ. hash join), соединение слиянием (англ. merge join). Единственное требование состоит в том, чтобы любая реализация логически давала такой же результат, как при применении описанного алгоритма.

SELECT * FROM Person INNER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва

OUTER JOIN

Соединение двух таблиц, в результат которого в обязательном порядке входят строки либо одной, либо обеих таблиц.

LEFT OUTER JOIN

Оператор левого внешнего соединения LEFT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи левой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие правой таблице, заполняются значениями 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

Оператор правого внешнего соединения RIGHT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи правой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие левой таблице, заполняются значениями NULL.
SELECT * FROM Person RIGHT OUTER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Сергей 1 1 Москва
Леонид 2 2 Санкт-Петербург
NULL NULL 3 Казань
FULL OUTER JOIN

Оператор полного внешнего соединения FULL OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение первой и второй таблиц по предикату (условию) p. Слова «первой» и «второй» здесь не обозначают порядок в записи (который неважен), а используются лишь для различения таблиц.

  1. В результат включается внутреннее соединение (INNER JOIN) первой и второй таблиц по предикату p.
  2. В результат добавляются те записи первой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие второй таблице, заполняются значениями NULL.
  3. В результат добавляются те записи второй таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие первой таблице, заполняются значениями NULL.
SELECT * FROM Person FULL OUTER JOIN City ON Person.CityId = City.Id

Результат:

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

CROSS JOIN

Оператор перекрёстного соединения, или декартова произведения CROSS JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы соединяется с каждой строкой второй таблицы, давая тем самым в результате все возможные сочетания строк двух таблиц.

SELECT * FROM Person CROSS JOIN City

или

SELECT * FROM Person, City

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Андрей 1 2 Санкт-Петербург
Андрей 1 3 Казань
Леонид 2 1 Москва
Леонид 2 2 Санкт-Петербург
Леонид 2 3 Казань
Сергей 1 1 Москва
Сергей 1 2 Санкт-Петербург
Сергей 1 3 Казань
Григорий 4 1 Москва
Григорий 4 2 Санкт-Петербург
Григорий 4 3 Казань

Если в предложении WHERE добавить условие соединения, то есть ограничения на сочетания кортежей, то результат эквивалентен операции INNER JOIN с таким же условием:

SELECT * FROM Person, City WHERE Person.CityId = City.Id

Таким образом, CROSS JOIN + WHERE(предикат) и INNER JOIN(предикат) синтаксически являются альтернативными формами записи одной и той же логической операции внутреннего соединения. Синтаксис CROSS JOIN + WHERE для операции соединения называют устаревшим,[1][2] поскольку его не рекомендует стандарт SQL ANSI.

Примечания

Ссылки

dikc.academic.ru

Join (SQL) - это... Что такое Join (SQL)?

У этого термина существуют и другие значения, см. Join. Правильный заголовок этой статьи — JOIN. Он показан некорректно из-за технических ограничений.

JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в раздел FROM операторов SELECT, UPDATE или DELETE.

Операция соединения, как и другие бинарные операции, предназначена для обеспечения выборки данных из двух таблиц и включения этих данных в один результирующий набор. Отличительной особенностью операции соединения является следующее:

  • в схему таблицы-результата входят столбцы обеих исходных таблиц (таблиц-операндов), то есть схема результата является «сцеплением» схем операндов;
  • каждая строка таблицы-результата является «сцеплением» строки из одной таблицы-операнда со строкой второй таблицы-операнда.

Определение того, какие именно исходные строки войдут в результат и в каких сочетаниях, зависит от типа операции соединения и от явно заданного условия соединения. Условие соединения, то есть условие сопоставления строк исходных таблиц друг с другом, представляет собой логическое выражение (предикат).

При необходимости соединения не двух, а нескольких таблиц, операция соединения применяется несколько раз (последовательно).

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

SELECT FIELD [,... n] FROM Table1 {INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN Table2 ON <condition>

В большинстве СУБД при указании слов LEFT, RIGHT, FULL слово OUTER можно опустить. Слово INNER также в большинстве СУБД можно опустить.

В общем случае СУБД при выполнении соединения проверяет условие (предикат) condition. Для CROSS JOIN условие не указывается.

Для перекрёстного соединения (декартова произведения) CROSS JOIN в некоторых реализациях SQL используется оператор «запятая» (,):

SELECT FIELD [,... n] FROM Table1, Table2

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

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

Люди, проживающие в городах (таблица Person)

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

Города (таблица City)

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

INNER JOIN

Оператор внутреннего соединения INNER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы сопоставляется с каждой строкой второй таблицы, после чего для полученной «соединённой» строки проверяется условие соединения (вычисляется предикат соединения). Если условие истинно, в таблицу-результат добавляется соответствующая «соединённая» строка.

Описанный алгоритм действий является строго логическим, то есть он лишь объясняет результат, который должен получиться при выполнении операции, но не предписывает, чтобы конкретная СУБД выполняла соединение именно указанным образом. Существует множество способов реализации операции соединения, например соединение вложенными циклами (англ. inner loops join), соединение хэшированием (англ. hash join), соединение слиянием (англ. merge join). Единственное требование состоит в том, чтобы любая реализация логически давала такой же результат, как при применении описанного алгоритма.

SELECT * FROM Person INNER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва

OUTER JOIN

Соединение двух таблиц, в результат которого в обязательном порядке входят строки либо одной, либо обеих таблиц.

LEFT OUTER JOIN

Оператор левого внешнего соединения LEFT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи левой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие правой таблице, заполняются значениями 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

Оператор правого внешнего соединения RIGHT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи правой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие левой таблице, заполняются значениями NULL.
SELECT * FROM Person RIGHT OUTER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Сергей 1 1 Москва
Леонид 2 2 Санкт-Петербург
NULL NULL 3 Казань
FULL OUTER JOIN

Оператор полного внешнего соединения FULL OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение первой и второй таблиц по предикату (условию) p. Слова «первой» и «второй» здесь не обозначают порядок в записи (который неважен), а используются лишь для различения таблиц.

  1. В результат включается внутреннее соединение (INNER JOIN) первой и второй таблиц по предикату p.
  2. В результат добавляются те записи первой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие второй таблице, заполняются значениями NULL.
  3. В результат добавляются те записи второй таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие первой таблице, заполняются значениями NULL.
SELECT * FROM Person FULL OUTER JOIN City ON Person.CityId = City.Id

Результат:

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

CROSS JOIN

Оператор перекрёстного соединения, или декартова произведения CROSS JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы соединяется с каждой строкой второй таблицы, давая тем самым в результате все возможные сочетания строк двух таблиц.

SELECT * FROM Person CROSS JOIN City

или

SELECT * FROM Person, City

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Андрей 1 2 Санкт-Петербург
Андрей 1 3 Казань
Леонид 2 1 Москва
Леонид 2 2 Санкт-Петербург
Леонид 2 3 Казань
Сергей 1 1 Москва
Сергей 1 2 Санкт-Петербург
Сергей 1 3 Казань
Григорий 4 1 Москва
Григорий 4 2 Санкт-Петербург
Григорий 4 3 Казань

Если в предложении WHERE добавить условие соединения, то есть ограничения на сочетания кортежей, то результат эквивалентен операции INNER JOIN с таким же условием:

SELECT * FROM Person, City WHERE Person.CityId = City.Id

Таким образом, CROSS JOIN + WHERE(предикат) и INNER JOIN(предикат) синтаксически являются альтернативными формами записи одной и той же логической операции внутреннего соединения. Синтаксис CROSS JOIN + WHERE для операции соединения называют устаревшим,[1][2] поскольку его не рекомендует стандарт SQL ANSI.

Примечания

Ссылки

dik.academic.ru

Join (SQL) - это... Что такое Join (SQL)?

У этого термина существуют и другие значения, см. Join. Правильный заголовок этой статьи — JOIN. Он показан некорректно из-за технических ограничений.

JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в раздел FROM операторов SELECT, UPDATE или DELETE.

Операция соединения, как и другие бинарные операции, предназначена для обеспечения выборки данных из двух таблиц и включения этих данных в один результирующий набор. Отличительной особенностью операции соединения является следующее:

  • в схему таблицы-результата входят столбцы обеих исходных таблиц (таблиц-операндов), то есть схема результата является «сцеплением» схем операндов;
  • каждая строка таблицы-результата является «сцеплением» строки из одной таблицы-операнда со строкой второй таблицы-операнда.

Определение того, какие именно исходные строки войдут в результат и в каких сочетаниях, зависит от типа операции соединения и от явно заданного условия соединения. Условие соединения, то есть условие сопоставления строк исходных таблиц друг с другом, представляет собой логическое выражение (предикат).

При необходимости соединения не двух, а нескольких таблиц, операция соединения применяется несколько раз (последовательно).

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

SELECT FIELD [,... n] FROM Table1 {INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN Table2 ON <condition>

В большинстве СУБД при указании слов LEFT, RIGHT, FULL слово OUTER можно опустить. Слово INNER также в большинстве СУБД можно опустить.

В общем случае СУБД при выполнении соединения проверяет условие (предикат) condition. Для CROSS JOIN условие не указывается.

Для перекрёстного соединения (декартова произведения) CROSS JOIN в некоторых реализациях SQL используется оператор «запятая» (,):

SELECT FIELD [,... n] FROM Table1, Table2

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

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

Люди, проживающие в городах (таблица Person)

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

Города (таблица City)

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

INNER JOIN

Оператор внутреннего соединения INNER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы сопоставляется с каждой строкой второй таблицы, после чего для полученной «соединённой» строки проверяется условие соединения (вычисляется предикат соединения). Если условие истинно, в таблицу-результат добавляется соответствующая «соединённая» строка.

Описанный алгоритм действий является строго логическим, то есть он лишь объясняет результат, который должен получиться при выполнении операции, но не предписывает, чтобы конкретная СУБД выполняла соединение именно указанным образом. Существует множество способов реализации операции соединения, например соединение вложенными циклами (англ. inner loops join), соединение хэшированием (англ. hash join), соединение слиянием (англ. merge join). Единственное требование состоит в том, чтобы любая реализация логически давала такой же результат, как при применении описанного алгоритма.

SELECT * FROM Person INNER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва

OUTER JOIN

Соединение двух таблиц, в результат которого в обязательном порядке входят строки либо одной, либо обеих таблиц.

LEFT OUTER JOIN

Оператор левого внешнего соединения LEFT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи левой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие правой таблице, заполняются значениями 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

Оператор правого внешнего соединения RIGHT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи правой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие левой таблице, заполняются значениями NULL.
SELECT * FROM Person RIGHT OUTER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Сергей 1 1 Москва
Леонид 2 2 Санкт-Петербург
NULL NULL 3 Казань
FULL OUTER JOIN

Оператор полного внешнего соединения FULL OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение первой и второй таблиц по предикату (условию) p. Слова «первой» и «второй» здесь не обозначают порядок в записи (который неважен), а используются лишь для различения таблиц.

  1. В результат включается внутреннее соединение (INNER JOIN) первой и второй таблиц по предикату p.
  2. В результат добавляются те записи первой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие второй таблице, заполняются значениями NULL.
  3. В результат добавляются те записи второй таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие первой таблице, заполняются значениями NULL.
SELECT * FROM Person FULL OUTER JOIN City ON Person.CityId = City.Id

Результат:

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

CROSS JOIN

Оператор перекрёстного соединения, или декартова произведения CROSS JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы соединяется с каждой строкой второй таблицы, давая тем самым в результате все возможные сочетания строк двух таблиц.

SELECT * FROM Person CROSS JOIN City

или

SELECT * FROM Person, City

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Андрей 1 2 Санкт-Петербург
Андрей 1 3 Казань
Леонид 2 1 Москва
Леонид 2 2 Санкт-Петербург
Леонид 2 3 Казань
Сергей 1 1 Москва
Сергей 1 2 Санкт-Петербург
Сергей 1 3 Казань
Григорий 4 1 Москва
Григорий 4 2 Санкт-Петербург
Григорий 4 3 Казань

Если в предложении WHERE добавить условие соединения, то есть ограничения на сочетания кортежей, то результат эквивалентен операции INNER JOIN с таким же условием:

SELECT * FROM Person, City WHERE Person.CityId = City.Id

Таким образом, CROSS JOIN + WHERE(предикат) и INNER JOIN(предикат) синтаксически являются альтернативными формами записи одной и той же логической операции внутреннего соединения. Синтаксис CROSS JOIN + WHERE для операции соединения называют устаревшим,[1][2] поскольку его не рекомендует стандарт SQL ANSI.

Примечания

Ссылки

3dic.academic.ru

Join (SQL) - это... Что такое Join (SQL)?

У этого термина существуют и другие значения, см. Join. Правильный заголовок этой статьи — JOIN. Он показан некорректно из-за технических ограничений.

JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в раздел FROM операторов SELECT, UPDATE или DELETE.

Операция соединения, как и другие бинарные операции, предназначена для обеспечения выборки данных из двух таблиц и включения этих данных в один результирующий набор. Отличительной особенностью операции соединения является следующее:

  • в схему таблицы-результата входят столбцы обеих исходных таблиц (таблиц-операндов), то есть схема результата является «сцеплением» схем операндов;
  • каждая строка таблицы-результата является «сцеплением» строки из одной таблицы-операнда со строкой второй таблицы-операнда.

Определение того, какие именно исходные строки войдут в результат и в каких сочетаниях, зависит от типа операции соединения и от явно заданного условия соединения. Условие соединения, то есть условие сопоставления строк исходных таблиц друг с другом, представляет собой логическое выражение (предикат).

При необходимости соединения не двух, а нескольких таблиц, операция соединения применяется несколько раз (последовательно).

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

SELECT FIELD [,... n] FROM Table1 {INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN Table2 ON <condition>

В большинстве СУБД при указании слов LEFT, RIGHT, FULL слово OUTER можно опустить. Слово INNER также в большинстве СУБД можно опустить.

В общем случае СУБД при выполнении соединения проверяет условие (предикат) condition. Для CROSS JOIN условие не указывается.

Для перекрёстного соединения (декартова произведения) CROSS JOIN в некоторых реализациях SQL используется оператор «запятая» (,):

SELECT FIELD [,... n] FROM Table1, Table2

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

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

Люди, проживающие в городах (таблица Person)

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

Города (таблица City)

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

INNER JOIN

Оператор внутреннего соединения INNER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы сопоставляется с каждой строкой второй таблицы, после чего для полученной «соединённой» строки проверяется условие соединения (вычисляется предикат соединения). Если условие истинно, в таблицу-результат добавляется соответствующая «соединённая» строка.

Описанный алгоритм действий является строго логическим, то есть он лишь объясняет результат, который должен получиться при выполнении операции, но не предписывает, чтобы конкретная СУБД выполняла соединение именно указанным образом. Существует множество способов реализации операции соединения, например соединение вложенными циклами (англ. inner loops join), соединение хэшированием (англ. hash join), соединение слиянием (англ. merge join). Единственное требование состоит в том, чтобы любая реализация логически давала такой же результат, как при применении описанного алгоритма.

SELECT * FROM Person INNER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Леонид 2 2 Санкт-Петербург
Сергей 1 1 Москва

OUTER JOIN

Соединение двух таблиц, в результат которого в обязательном порядке входят строки либо одной, либо обеих таблиц.

LEFT OUTER JOIN

Оператор левого внешнего соединения LEFT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи левой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие правой таблице, заполняются значениями 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

Оператор правого внешнего соединения RIGHT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p.

  1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p.
  2. Затем в результат добавляются те записи правой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие левой таблице, заполняются значениями NULL.
SELECT * FROM Person RIGHT OUTER JOIN City ON Person.CityId = City.Id

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Сергей 1 1 Москва
Леонид 2 2 Санкт-Петербург
NULL NULL 3 Казань
FULL OUTER JOIN

Оператор полного внешнего соединения FULL OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Пусть выполняется соединение первой и второй таблиц по предикату (условию) p. Слова «первой» и «второй» здесь не обозначают порядок в записи (который неважен), а используются лишь для различения таблиц.

  1. В результат включается внутреннее соединение (INNER JOIN) первой и второй таблиц по предикату p.
  2. В результат добавляются те записи первой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие второй таблице, заполняются значениями NULL.
  3. В результат добавляются те записи второй таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие первой таблице, заполняются значениями NULL.
SELECT * FROM Person FULL OUTER JOIN City ON Person.CityId = City.Id

Результат:

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

CROSS JOIN

Оператор перекрёстного соединения, или декартова произведения CROSS JOIN соединяет две таблицы. Порядок таблиц для оператора неважен, поскольку оператор является симметричным.

Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц.

Тело результата логически формируется следующим образом. Каждая строка одной таблицы соединяется с каждой строкой второй таблицы, давая тем самым в результате все возможные сочетания строк двух таблиц.

SELECT * FROM Person CROSS JOIN City

или

SELECT * FROM Person, City

Результат:

Person.Name Person.CityId City.Id City.Name
Андрей 1 1 Москва
Андрей 1 2 Санкт-Петербург
Андрей 1 3 Казань
Леонид 2 1 Москва
Леонид 2 2 Санкт-Петербург
Леонид 2 3 Казань
Сергей 1 1 Москва
Сергей 1 2 Санкт-Петербург
Сергей 1 3 Казань
Григорий 4 1 Москва
Григорий 4 2 Санкт-Петербург
Григорий 4 3 Казань

Если в предложении WHERE добавить условие соединения, то есть ограничения на сочетания кортежей, то результат эквивалентен операции INNER JOIN с таким же условием:

SELECT * FROM Person, City WHERE Person.CityId = City.Id

Таким образом, CROSS JOIN + WHERE(предикат) и INNER JOIN(предикат) синтаксически являются альтернативными формами записи одной и той же логической операции внутреннего соединения. Синтаксис CROSS JOIN + WHERE для операции соединения называют устаревшим,[1][2] поскольку его не рекомендует стандарт SQL ANSI.

Примечания

Ссылки

biograf.academic.ru