Единственный тип присоединения к вам действительно нужен LEFT OUTER JOIN
. Любой другой тип объединения может быть переписан с точки зрения одного или нескольких левых внешних объединений и, возможно, некоторой фильтрации. Так зачем нам все остальные? Это просто смущать людей? Не было бы проще, если бы был только один тип соединения?
Вы также можете спросить: почему есть и a <= b
, и b >= a
? Разве они не делают то же самое? Разве мы не можем просто избавиться от одного из них? Это упростило бы вещи!
Иногда проще поменять <=
на >=
, чем менять местами аргументы. Точно так же левое соединение и правое соединение - это то же самое, что и при замене операндов. Но опять же целесообразно иметь оба варианта вместо того, чтобы требовать от людей писать свои запросы в определенном порядке.
Еще одна вещь, которую вы могли бы спросить: по логике, почему у нас AND
, OR
, NOT
, XOR
, NAND
, NOR
и т. Д.? Все это можно переписать в терминах NAND
с! Почему бы просто не иметь NAND
? Ну, это неловко писать OR
в терминах NAND
с, и не столь очевидно, каково намерение - если вы пишете OR
, люди сразу понимают, что вы имеете в виду. Если вы напишите кучу NAND
s, не очевидно, чего вы пытаетесь достичь.
Точно так же, если вы хотите сделать a FULL OUTER JOIN b
, вы можете сделать левое и правое соединения, удалить дублированные результаты, а затем объединить все. Но это боль, и поэтому есть сокращение.
Когда вы используете каждый? Вот упрощенное правило:
- Если вам всегда нужна строка результатов для каждой строки в таблице LEFT, используйте LEFT OUTER JOIN.
- Если вы всегда хотите, чтобы строка результатов была для каждой строки в ПРАВЫЙ таблице, используйте RIGHT OUTER JOIN.
- Если вам всегда нужна строка результата для каждой строки в любой таблице, используйте FULL OUTER JOIN.
- Если вам нужна строка результата, только если в обеих таблицах есть строка, используйте INNER JOIN.
- Если вам нужны все возможные пары строк, по одной строке от каждой таблицы, используйте CROSS JOIN.