Ответ 1
ПРИМЕЧАНИЕ. Все это можно найти в Википедии: Join (SQL).
Существует три типа соединений OUTER:
- LEFT OUTER JOIN
- ПРАВИЛЬНОЕ ВСТУПЛЕНИЕ ВМЕСТЕ
- ПОЛНАЯ ВСТРОЕННАЯ РАБОТА
Ключевое слово OUTER является необязательным во всех реализациях, которые следуют стандарту, поэтому FULL JOIN совпадает с FULL OUTER JOIN. (Я оставил слово OUTER
из SQL в остальной части этого ответа.)
Посмотрим, что каждый делает.
Рассмотрим следующие два набора входных данных:
Set "A" Set "B"
AA BB
-------- --------
Item 1 Item 3
Item 2 Item 4
Item 3 Item 5
Item 4 Item 6
Обратите внимание, что в есть некоторые элементы, которые не находятся в B, и наоборот.
Теперь, если мы напишем инструкцию SQL, как это, используя LEFT join:
SELECT * FROM A LEFT JOIN B ON AA = BB
Вы получите следующий результат (пустые дыры на самом деле NULL
):
AA BB
-------- --------
Item 1
Item 2
Item 3 Item 3
Item 4 Item 4
Обратите внимание, что вы получите все строки из АА или, вернее, все строки из левой части предложения соединения.
Если вы переключитесь на использование RIGHT join:
SELECT * FROM A RIGHT JOIN B ON AA = BB
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
Item 5
Item 6
Обратите внимание, что вы получаете все строки из правой части условия соединения.
Однако, если вы хотите все строки обоих, вы будете использовать FULL join:
SELECT * FROM A FULL JOIN B ON AA = BB
AA BB
-------- --------
Item 1 <-----+
Item 2 |
Item 3 Item 3 |
Item 4 Item 4 |
Item 5 +--- empty holes are NULL's
Item 6 |
^ |
| |
+---------------------+
Как указано в комментарии, позвольте мне заполнить другие способы подключения.
С INNER join:
SELECT * FROM A INNER JOIN B ON AA = BB
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
С соединением INNER мы получаем только строки, которые на самом деле совпадают, без отверстий из-за соединения.
Соединение CROSS создает декартово произведение, сопоставляя каждую строку из первого набора с каждой строкой из второго набора:
SELECT * FROM A CROSS JOIN B
AA BB
-------- --------
Item 1 Item 3 ^
Item 1 Item 4 +--- first item from A, repeated for all items of B
Item 1 Item 5 |
Item 1 Item 6 v
Item 2 Item 3 ^
Item 2 Item 4 +--- second item from A, repeated for all items of B
Item 2 Item 5 |
Item 2 Item 6 v
Item 3 Item 3 ... and so on
Item 3 Item 4
Item 3 Item 5
Item 3 Item 6
Item 4 Item 3
Item 4 Item 4
Item 4 Item 5
Item 4 Item 6
Также обратите внимание, что мы не укажем, какие столбцы должны совпадать, так как нет соответствующего соответствия.
Наконец, NATURAL join, в этом синтаксисе мы не укажем, какие столбцы соответствуют, но соответствуют именам столбцов. В нашем надуманном примере имена столбцов не совпадают, но, допустим, для этого конкретного примера, что имена столбцов в обеих таблицах были XX, тогда мы получим следующий результат:
SELECT * FROM A NATURAL JOIN B
+----------+------- matches on the names, and then the data
| |
v v
XX XX
-------- --------
Item 3 Item 3
Item 4 Item 4
Как вы можете видеть, вы получаете то же самое, что и INNER join, но не должны вводить совпадающую часть предложения join.