Каково использование различных операций соединения в SQL? Как я хочу знать, почему нам нужны различные внутренние и внешние объединения?
Единственный тип соединения, который вам действительно нужен, - это ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
. Любой другой тип соединения может быть переписан в терминах одного или нескольких левых внешних объединений и, возможно, некоторой фильтрации. Так зачем нам все остальные? Чтобы просто запутать людей? Не было бы проще, если бы был только один тип соединения?
Вы также можете спросить: почему оба a <= b
и b> = a
? Разве они не делают то же самое? Разве мы не можем просто избавиться от одного из них? Это упростило бы жизнь!
Иногда проще поменять местами <=
на > =
вместо того, чтобы менять местами аргументы. Точно так же левое соединение и правое соединение - это одно и то же, только с переставленными операндами. Но, опять же, практично иметь оба варианта вместо того, чтобы требовать от людей писать свои запросы в определенном порядке.
Еще один вопрос, который вы могли бы спросить: в логике, почему у нас есть И
, ИЛИ
, НЕ
, XOR
, ] NAND
, NOR
и т. Д.? Все это можно переписать в терминах NAND
s! Почему бы просто не иметь NAND
? Что ж, неудобно писать ИЛИ
в терминах NAND
s, и не так очевидно, какова цель - если вы напишете ИЛИ
], люди сразу понимают, что вы имеете в виду. Если вы напишете кучу NAND
s, не будет очевидно, чего вы пытаетесь достичь.
Точно так же, если вы хотите выполнить ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ b
, вы можете выполнить левое и правое соединение, удалить повторяющиеся результаты и затем объединить все. Но это боль, и поэтому есть сокращение.
Когда вы используете каждый из них? Вот упрощенное правило:
внутреннее соединение
- объединяет строки из обоих наборов соответствия на основе заданных критериев.
external join
- выбирает все из одного набора вместе с совпадающими или пустыми (если не совпадают) элементами из другого набора. Внешние соединения могут быть левыми
или правыми
, чтобы указать, какой набор будет возвращен полностью.
В моем ответе предполагается, что 2 таблицы объединены одним ключом:
INNER JOIN
- получить результаты, которые находятся в обеих объединить таблицы (согласно правилу соединения) FULL OUTER JOIN
- получить все результаты из обеих таблиц (декартово произведение) LEFT OUTER JOIN
- получить все результаты из левой таблицы и сопоставления результаты справа Вы можете добавить предложения WHERE
, чтобы еще больше ограничить результаты.
Используйте их, чтобы получить только то, что вы хотите .
Чтобы другие ответы были более ясными - ВЫ ПОЛУЧАЕТЕ РАЗНЫЕ РЕЗУЛЬТАТЫ в зависимости от выбранного вами соединения, например, когда столбцы, к которым вы присоединяетесь, содержат нулевые значения.
Итак - для каждого реального сценария существует подходящее соединение (либо вам нужны строки без данных, либо нет в примере с нулевыми значениями).