2010-04-11 5 views
6

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

+1

Почему люди в мире голосуют за этот вопрос? – Nix

+0

Ум. Может быть, это хороший вопрос с их точки зрения? – EvilTeach

ответ

7

Единственный тип присоединения к вам действительно Потребность LEFT OUTER JOIN. Каждый другой тип соединения может быть переписан в терминах одного или нескольких левых внешних объединений и, возможно, некоторой фильтрации. Так зачем нам всем остальным? Разве это просто путает людей? Разве это не было бы проще, если бы был только один тип соединения?

Вы также можете задать вопрос: почему есть a <= b и b >= a? Разве они не делают то же самое? Разве мы не можем избавиться от одного из них? Это упростило бы все!

Иногда проще обменивать <= на >= вместо того, чтобы обменивать аргументы круглыми. Точно так же левое соединение и правое соединение - это одно и то же, только с заменой операндов. Но опять же практично иметь оба варианта вместо того, чтобы требовать от людей писать свои запросы в определенном порядке.

Другая вещь, которую вы могли бы спросить: В логике, почему у нас есть AND, OR, NOT, XOR, NAND, NOR и т.д.? Все это можно переписать в терминах NAND s! Почему не просто NAND?Ну, это awkward, чтобы написать OR с точки зрения NAND s, и это не так очевидно, что это за намерение - если вы пишете OR, люди сразу понимают, что вы имеете в виду. Если вы напишете кучу NAND s, неясно, чего вы пытаетесь достичь.

Аналогичным образом, если вы хотите сделать a FULL OUTER JOIN b, вы можете сделать левое соединение и присоединиться к праву, удалить дублированные результаты, а затем объединить все. Но это боль, и поэтому есть сокращение.

Когда вы используете каждый из них? Вот упрощенное правило:

  • Если вы всегда хотите строку результатов для каждой строки таблицы LEFT, используйте LEFT OUTER JOIN.
  • Если вы всегда хотите строку результатов для каждой строки в таблице RIGHT, используйте ПРАВИЛЬНУЮ ВНУТРЕННУЮ РАБОТУ.
  • Если вам всегда нужна строка результатов для каждой строки в любой из таблиц, используйте ПОЛНУЮ ВНЕШНЮЮ СОЕДИНЕНИЕ.
  • Если вам нужна только строка результатов, когда в обеих таблицах есть строка, используйте INNER JOIN.
  • Если вы хотите, чтобы все возможные пары строк, одна строка из каждой таблицы, используйте CROSS JOIN.
2

Эта ссылка должна удалить все вы присоединитесь связанные сомнения:

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

+0

Я использовал этот учебник для понимания операций объединения до публикации. Вопрос: почему нам нужно так много разных операций соединения? Когда использовать операцию соединения? – varunthacker

1

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

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

1

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

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

0

Мой ответ предполагает 2 таблиц, соединенных на одном ключе:

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

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

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