Дополнительно
SQL JOIN и различные типы JOINов
Что такое SQL JOIN
и каковы его типы?
236
6
Что такое SQL JOIN
и каковы его типы?
Иллюстрация из W3schools:
Что такое
SQL JOIN
?SQL JOIN
- это метод получения данных из двух или более таблиц базы данных.Чем отличаются
SQL JOIN
?Всего существует пять
JOIN
. К ним относятся:JOIN или INNER JOIN:
В этом типе
JOIN
мы получаем все записи, которые соответствуют условию в обеих таблицах, а записи в обеих таблицах, которые не соответствуют условию, не сообщаются.Другими словами,
INNER JOIN
основан на единственном факте, что: ТОЛЬКО совпадающие записи в обеих таблицах ДОЛЖНЫ быть перечислены.Обратите внимание, что
JOIN
без каких-либо других ключевых словJOIN
(таких какINNER
,OUTER
,LEFT
и т.д.) являетсяINNER JOIN
. Другими словами,JOIN
является синтаксический сахар дляINNER JOIN
(см.: https://stackoverflow.com/questions/565620/difference-between-join-and-inner-join).ВНЕШНЕЕ СОЕДИНЕНИЕ:
OUTER JOIN
извлекаетЛибо, совпадающие строки из одной таблицы и все строки в другой таблице либо, все строки во всех таблицах (не имеет значения, есть ли совпадение или нет).
Существует три вида внешнего соединения:
2.1 LEFT OUTER JOIN или LEFT JOIN.
Это соединение возвращает все строки из левой таблицы в сочетании с соответствующими строками из правой таблицы. Если в правой таблице нет совпадающих столбцов, возвращаются значения
NULL
.2.2 ПРЯМОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ или ПРЯМОЕ СОЕДИНЕНИЕ.
Этот
JOIN
возвращает все строки из правой таблицы в сочетании с совпадающими строками из левой таблицы. Если в левой таблице нет совпадающих столбцов, возвращаются значенияNULL
.2.3 FULL OUTER JOIN или ПОЛНЫЙ ДЖОИН.
Этот
JOIN
объединяетLEFT OUTER JOIN
иRIGHT OUTER JOIN
. Он возвращает строки из любой таблицы при выполнении условий и возвращает значениеNULL
при отсутствии совпадений.Другими словами,
OUTER JOIN
основан на том, что: В списке должны быть только совпадающие записи в ОДНОЙ из таблиц (ПРЯМОЙ или ЛЕВОЙ) или ОБОИХ таблицах (ПОЛНОСТЬЮ).НАТУРАЛЬНОЕ СОЕДИНЕНИЕ:
Оно основано на двух условиях:
JOIN
делается на всех столбцах с одинаковым именем для равенства.Это кажется скорее теоретическим, и в результате (вероятно) большинство СУБД даже не пытаются поддерживать это.
CROSS JOIN:
Это декартово произведение двух таблиц. Результат
CROSS JOIN
не будет иметь смысла в большинстве ситуаций. Более того, он нам вообще не понадобится (или понадобится в наименьшей степени, если быть точным).SELF JOIN:
Это не другая форма
JOIN
, скорее этоJOIN
(INNER
,OUTER
и т.д.) таблицы к самой себе.JOINs based on Operators
В зависимости от оператора, используемого в предложении
JOIN
, может быть два типаJOIN
. ЭтоЭкви JOIN
Тета СОЕДИНЕНИЕ
Equi JOIN:
Для любого типа
JOIN
(INNER
,OUTER
и т.д.), если мы используем ТОЛЬКО оператор равенства (=), то мы говорим, что чтоJOIN
являетсяEQUI JOIN
.Тета JOIN:
Это то же самое, что и
EQUI JOIN
, но позволяет использовать все другие операторы, такие как >, = и т.д.Определение:
JOINS - это способ запросить данные, объединенные из нескольких таблиц одновременно.
Типы JOINS:
В РСУБД существует 5 типов объединений:
Equi-Join: Объединяет общие записи из двух таблиц на основе условия равенства. Технически, объединение выполняется с помощью оператора равенства (=) для сравнения значений первичного ключа одной таблицы и значений внешнего ключа другой таблицы, поэтому набор результатов включает общие (совпадающие) записи из обеих таблиц. О реализации см. в разделе INNER-JOIN.
Natural-Join: Это улучшенная версия Equi-Join, в которой операция SELECT исключает дублирующие столбцы. Для реализации см. раздел INNER-JOIN
Non-Equi-Join: Это обратная версия Equi-join, где условие соединения использует другие операторы, чем оператор равенства (=), например, !=, =, >, < или BETWEEN и т.д. О реализации см. в разделе INNER-JOIN.
Self-Join:: Настроенное поведение объединения, когда таблица объединяется сама с собой; обычно это необходимо для запросов к таблицам с самоссылками (или сущностям с унарными отношениями). Для реализации см. раздел INNER-JOINs.
Cartesian Product: Это перекрестное объединение всех записей обеих таблиц без каких-либо условий. Технически, он возвращает набор результатов запроса без WHERE-клаузулы.
Согласно концепции и развитию SQL, существует 3 типа соединений, и все соединения в СУБД могут быть достигнуты с помощью этих типов соединений.
INNER-JOIN: Это слияние (или объединение) совпадающих строк из двух таблиц. Совмещение выполняется на основе общих столбцов таблиц и операции их сравнения. Если условие основано на равенстве, то: выполняется EQUI-JOIN, в противном случае - Non-EQUI-Join.
OUTER-JOIN: Он объединяет (или комбинирует) совпадающие строки из двух таблиц и несовпадающие строки с NULL значениями. Однако, можно настроить выбор несовпадающих строк, например, выбрать несовпадающую строку из первой или второй таблицы по подтипам: LEFT OUTER JOIN и RIGHT OUTER JOIN.
2.1. ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ (оно же LEFT-JOIN): Возвращает совпадающие строки из двух таблиц и несовпадающие только из левой таблицы (т.е. первой таблицы).
2.2. ПРАВОЕ внешнее объединение (оно же RIGHT-JOIN): Возвращает совпадающие строки из двух таблиц и несмежные только из ПРАВОЙ таблицы.
2.3. ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ (оно же ВНЕШНЕЕ СОЕДИНЕНИЕ): Возвращает совпадающие и несовпадающие строки из обеих таблиц.
CROSS-JOIN: Это соединение не объединяет/сливает, вместо этого оно выполняет декартово произведение.
![введите описание изображения здесь][1] Примечание: Self-JOIN может быть достигнуто с помощью INNER-JOIN, OUTER-JOIN и CROSS-JOIN в зависимости от требований, но таблица должна соединяться сама с собой.
[Дополнительная информация:][2].
Примеры:
1.1: INNER-JOIN: реализация Equi-join.
1.2: INNER-JOIN: реализация Natural-JOIN
1.3: INNER-JOIN с реализацией NON-Equi-join.
Интересно отметить, что большинство других ответов страдают от этих двух проблем:
Первое и самое главное: соединения декартовым
Именно поэтому диаграммы Венна объяснить их так неточно, потому что объединение создает декартово произведение между двух соединяемых таблиц. В Википедии иллюстрирует это красиво: Синтаксис SQL для декартовым является перекрестное соединение`. Например:
Которая сочетает в себе все строки из одной таблицы все строки из другой таблицы: Источник: в
Результат: в
Если мы просто пишем их через запятую таблицы, мы'll получить то же:
Внутреннее соединение (тэта-соединение)
Для себя внутреннее соединение-это просто отфильтрован перекрестное соединение, где предикат фильтра называется
тета
в реляционной алгебре. Например:Обратите внимание, что ключевое слово "внешнее" является обязательным (за исключением в MS доступ). (посмотреть на статью приводить примеры)
ОБОР ПРИСОЕДИНИТЬСЯ
Особый вид тэта-соединение обор присоединиться, которые мы используем наиболее. Сказуемое присоединяется к первичному ключу одной таблицы с внешним ключом другой таблицы. Если мы используем базы данных "sakila" для иллюстрации, мы можем написать:
Это объединяет всех участников с их фильмами. Или же, в некоторых базах данных:
`С помощью (синтаксис) предназначена для указания столбцов, которые должны присутствовать на каждой стороне операции Join'таблиц S и создает предикат равенства этих двух столбцов.
ЕСТЕСТВЕННОЕ СОЕДИНЕНИЕ
Другие ответы перечислили это на "либо" по отдельности, но это вовсе'т смысл. Это's просто синтаксис сахара форма для обор соединение, которое является частным случаем тета-соединения или внутреннее соединение. Естественное соединение просто собирает все столбцы, которые являются общими для обоих таблицах присоединился и присоединяется с помощью()
эти столбцы. Что вряд ли когда-нибудь пригодятся, из-за случайного совпадения (как
LAST_UPDATE` столбцов в базы данных "sakila"). Здесь'ы синтаксис:ВНЕШНЕЕ СОЕДИНЕНИЕ
Теперь,
внешнее объединение
немного отличается отвнутреннее соединение
как создаетсяСоюз
из нескольких декартовым. Мы можем написать:Никто не хочет написать, как последние, так и запишем
внешнее
(который, как правило, лучше оптимизирован для баз данных). Каквнутренний
, ключевое слово "внешние" не является обязательным, здесь.Внешнее объединение
в трех вариантах:: обе таблицы "присоединиться" выражение добавляются в Союз, как показано выше. Все они могут быть объединены с сайта с помощью()
илиприродных
(я'вэ на самом деле был реальный случай на природные полный присоединись к недавно)Альтернативные синтаксисы
Есть некоторые исторические, поддерживается в Oracle и SQL Server, который поддерживает
внешнее
уже стандарт SQL был синтаксис синтаксис:Сказав так, Дон'т использовать этот синтаксис. Я просто перечислю здесь, так что вы можете признать его от старого блога / устаревший код.
Секционированных
внешнее объединение
Мало кто знает, но стандарт SQL определяет секционированных
внешнее
(и Oracle реализует его). Вы можете писать такие вещи:Частей в результате: в
Дело в том, что все строки из секции соединения окажемся в конечном итоге независимо от того,
присоединиться
ничего не соответствуют о "другую сторону вступить на". Длинная короткая история: это заполнить разреженные данные в отчетах. Очень полезно!ПОЛУСОЕДИНЕНИЯ
Серьезно? Никакой другой ответ получил? Конечно, нет, потому что это не'т иметь собственный синтаксис в SQL, к сожалению]7 (так же, как анти-присоединение ниже). Но мы можем использовать
в () и существует()
, например, чтобы найти всех актеров, которые играли в фильмах:В
где.actor_id = ФА.actor_id
предикат выступает как предикат полусоединения. Если вы Don'т поверить, проверить планы выполнения, например, в Oracle. Вы'увидите, что база данных выполняет операции полусоединения, не существует()` предикат.АНТИ ПРИСОЕДИНИТЬСЯ
Это прямо противоположно полусоединения (будьте осторожны, не используйте
не в
если, а это важный нюанс) Здесь представлены все актеры без пленки:Некоторые люди (в частности MySQL) также писать против присоединиться, как это:
Я думаю, что историческая причина-это производительность.
ПРИСОЕДИНЯЙТЕСЬ К ЛАТЕРАЛЬНОЙ
ОМГ, это слишком круто. Я'м только один, чтобы упомянуть его? Здесь'ы прохладном запроса:
Он найдет ТОП-5 компания по производству фильмов одного актера. Каждый раз, когда вам нужен топ-Н-в-то запрос,
боковое присоединиться
будет вашим другом. Если вы'вновь на SQL сервере человека, тогда вы знаете, этого "присоединиться" типа под название "применить"ОК, возможно, что'ы обман, потому что
боковое присоединиться
илиприменить
выражение действительно на "коррелированный подзапрос", которую производит несколько рядов. Но если мы допускаем, что "коррелированные подзапросы" мы можем также говорить о...МУЛЬТИМНОЖЕСТВО
Это только действительно реализованный в Oracle и Informix (насколько мне известно), но его можно эмулировать в PostgreSQL с использованием массивов и/или XML и SQL-сервером с помощью XML.
МУЛЬТИНАБОР
производит коррелированный подзапрос и гнезда результирующий набор строки во внешнем запросе. Приведенный ниже запрос выбирает все актеры и каждый актер собирает свои фильмы во вложенной коллекции:Как вы видели, есть несколько типов присоединиться, чем просто в "скучно" и
внутренний
,внешний
и `перекрестного соединения, которые обычно упоминаются. Более подробно в моей статье. И, пожалуйста, прекратите использование диаграммы Венна для иллюстрации их.Я создал иллюстрацию, которая объясняет лучше, чем слова, на мой взгляд:
Я'м собираюсь давить на мое больное место: с помощью ключевых слов.
Если обе таблицы на обеих сторонах соединения имеют свои внешние ключи правильно назвали (т. е. то же имя, не просто и"ИД), то это может быть использовано:
Я нахожу это очень практичным, читабельным и не используется достаточно часто.