Каковы виды использования различных операций соединения в SQL? - PullRequest
6 голосов
/ 11 апреля 2010

Каковы различные операции объединения в SQL? Как будто я хочу знать, зачем нам разные внутренние и внешние соединения?

Ответы [ 5 ]

7 голосов
/ 11 апреля 2010

Единственный тип присоединения к вам действительно нужен 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.
2 голосов
/ 11 апреля 2010

Эта ссылка должна очистить все ваши сомнения, связанные с JOIN:

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

1 голос
/ 11 апреля 2010

Чтобы сделать другие ответы более понятными - ВЫ ПОЛУЧАЕТЕ РАЗНЫЕ РЕЗУЛЬТАТЫ в соответствии с выбранным объединением, когда столбцы, к которым вы присоединяетесь, содержат нулевые значения - например.

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

1 голос
/ 11 апреля 2010

inner join - объединяет строки из обоих наборов соответствия на основе указанных критериев.

outer join - выбирает все из одного набора вместе с совпадающими или пустыми (если не совпадают) элементами из другого набора. Внешние объединения могут быть left или right, чтобы указать, какой набор возвращается полностью.

0 голосов
/ 11 апреля 2010

В моем ответе предполагается, что две таблицы объединены по одной клавише:

  • INNER JOIN - получить результаты, которые находятся в обеих таблицах объединения (согласно правилу объединения)
  • FULL OUTER JOIN - получить все результаты из обеих таблиц (декартово произведение)
  • LEFT OUTER JOIN - получить все результаты из левой таблицы и соответствующие результаты справа

Вы можете добавить предложения WHERE для дальнейшего ограничения результатов.

Используйте их, чтобы получить только то, что вы хотите получить.

...