Внутренние (INNER
) и внешние (OUTER
) соединения
Соединение всегда соединяет строки из двух наборов данных (которые обычно называются “левый” и “правый”). По умолчанию, только строки, удовлетворяющие условию соединения (то есть, которым соответствует хотя бы одна строка из другого набора строк согласно применяемому условию) попадают в результирующий набор данных.Такой тип соединения называется внутренним (INNER JOIN
). Поскольку внутреннее соединение является типом соединения по умолчнию, то ключевое слово INNER
можно опустить.
Предположим, у нас есть 2 таблицы:
ID | S |
---|---|
87 |
Just some text |
35 |
Silence |
CODE | X |
---|---|
-23 |
56.7735 |
87 |
416.0 |
Если мы соединим эти таблицы с помощью вот такого запроса:
SELECT *
FROM A
JOIN B ON A.id = B.code
то результат будет:
ID | S | CODE | X |
---|---|---|---|
87 |
Just some text |
87 |
416.0 |
То есть, первая строка таблицы А была соединена со второй строкой таблицы B, потому что вместе они удовлетворяют условию соединения “A.id = B.code
”. Другие строки не имеют соответствия и поэтому не включаются в соединение.Помните, что умолчанию соединение всегда внутреннее (INNER).
Мы можем сделать это явным, указав тип соединения:
SELECT *
FROM A
INNER JOIN B ON A.id = B.code
но обычно слово INNER
опускается.
Разумеется, возможны случаи, когда строке в левом наборе данных соответствует несколько строк в правом наборе данных (или наоборот).
В таких случаях все комбинации включаются в результирующих набор данных, и мы можем получить результат вроде этого:
ID | S | CODE | X |
---|---|---|---|
87 |
Just some text |
87 |
416.0 |
87 |
Just some text |
87 |
-1.0 |
-23 |
Don’t know |
-23 |
56.7735 |
-23 |
Still don’t know |
-23 |
56.7735 |
-23 |
I give up |
-23 |
56.7735 |
Иногда необходимо включить в результат все записи из левого или правого набора данных, вне зависимости от того, есть ли для них соответствующая запись в парном наборе данных.В этом случае необходимо использовать внешние соединения.
Внешнее левое соединение (LEFT OUTER) включает все записи из левого набора данных, и те записи из правого набора, которые удовлетворяют условию соединения.
Внешнее правое соединение (RIGHT OUTER) включает все записи из правого набора данных и те записи из левого набора данных, которые удовлетворяют условию соединения.
Полное внешнее соединение (FULL OUTER) включает все записи из обоих наборов данных.
Во всех внешних соединениях, “дыры” (то есть поля набора данных, в которых нет соответствующей записи) заполняются NULL
.
Для обозначения внешнего соединения используются ключевые слова LEFT
, RIGHT
или FULL
с необязательным ключевым словом OUTER
.
Рассмотрим различные внешние соединения на примере запросов с указанными выше таблицами A и B:
SELECT *
FROM A
LEFT OUTER JOIN B ON A.id = B.code
то же самое
SELECT *
FROM A
LEFT JOIN B ON A.id = B.code
ID | S | CODE | X |
---|---|---|---|
87 |
Just some text |
87 |
416.0 |
235 |
Silence |
<null> |
<null> |
SELECT *
FROM A
RIGHT OUTER JOIN B ON A.id = B.code
то же самое
SELECT *
FROM A
RIGHT JOIN B ON A.id = B.code
ID | S | CODE | X |
---|---|---|---|
<null> |
<null> |
-23 |
56.7735 |
87 |
Just some text |
87 |
416.0 |
SELECT *
FROM A
FULL OUTER JOIN B ON A.id = B.code
то же самое
SELECT *
FROM A
FULL JOIN B ON A.id = B.code
ID | S | CODE | X |
---|---|---|---|
<null> |
<null> |
-23 |
56.7735 |
87 |
Just some text |
87 |
416.0 |
235 |
Silence |
<null> |
<null> |