Чем отличается join от inner join
Перейти к содержимому

Чем отличается join от inner join

  • автор:

Разница между JOIN и INNER JOIN

Есть ли разница между операциями в производительности или иным образом? Различия между различными реализациями SQL?

driis 19 фев. 2009, в 15:14
Поделиться
Посмотрите этот вопрос: < stackoverflow.com/questions/448023?sort=newest >
Joel Coehoorn 19 фев. 2009, в 14:50
В качестве примечания: CROSS JOIN — это полезный тип соединения (он отличается от INNER JOIN).
Serge 14 май 2013, в 11:57
Поделиться:

8 ответов

Лучший ответ

Они функционально эквивалентны, но INNER JOIN может быть более понятным для чтения, особенно если запрос содержит другие типы соединений (т.е. LEFT или RIGHT или CROSS )).

palehorse 19 фев. 2009, в 16:46
Поделиться

Это правда для всех баз данных (например, SQL, postgres?) Кто-нибудь знает ссылку на документацию, объясняющую это?

Chogg 25 окт. 2017, в 17:32
Indian 26 янв. 2018, в 10:14
Запрос достаточно ясен, просто написав JOIN, INNER — это просто шум.
Ivanzinho 30 июль 2018, в 16:34

Может быть, я пурист, но я думаю, что при написании SQL лучше быть явным, чем неявным. INNER JOIN более читабелен, особенно в сложных запросах.

bruceskyaus 29 нояб. 2018, в 21:15
Определенно согласен, что ВНУТРЕННИЙ является более читабельным.
MrR 03 янв. 2019, в 22:22
Показать ещё 3 комментария

Просто набрав JOIN выполняет операцию INNER JOIN по умолчанию.

Для всех остальных одна картина иногда стоит более сотни слов:

Изображение 3970

Damian Drygiel 28 окт. 2013, в 23:38
Поделиться

В этом случае сотни слов могли бы ответить на вопрос. Эта картинка просто не содержит ответа на вопрос. Вопрос заключался в разнице между JOIN и INNER JOIN, и на этой картинке нет примера только для JOIN. Тем не менее, я знаю и очень люблю эту картину, но она неуместна в качестве ответа.

konqi 10 дек. 2013, в 11:01
Я пришел сюда в поисках ярлыка JOIN. Я знаю, что делают ВНУТРЕННИЙ, ЛЕВЫЙ И ПРАВЫЙ.
Julia McGuigan 01 апр. 2015, в 17:20
Это правильные изображения? я нашел ошибки
Виталий Семеняко 12 окт. 2015, в 13:02
Я даже не понимаю разницу между красным и белым на этой картинке.
Magnus Burton 02 фев. 2016, в 12:23
Я считаю, что красный цвет означает, что элементы, которые выбраны
Jens Bodal 05 фев. 2016, в 22:39

Единственное, на что следует обратить внимание при таком типе представления, это то, что перекрывающаяся область может «выпячиваться», если вы присоединяетесь к неуникальным ключам.

Jeff 16 март 2016, в 19:34
@konqi Это фактически ответило на вопрос для меня.
mxplusb 25 дек. 2016, в 21:12

Не правда ли, утверждения под фотографиями посередине левого и среднего правого неверны? Разве они не должны быть «. где B.Key НЕ является нулевым . «?

Toastgeraet 25 апр. 2018, в 07:52

Поскольку на фотографии не упоминается одиночное ключевое слово JOIN , изображение бесполезно в качестве вспомогательного ресурса — этот пост был бы столь же ценным без него. Другими словами, этот ответ мог быть только первым предложением и избавил страницу от огромного количества пустяков. Вот та же фотография (2 года назад). В чем разница между INNER JOIN, LEFT JOIN, RIGHT JOIN и FULL JOIN? где точность изображения оспаривается пользователями.

mickmackusa 11 май 2018, в 01:08

говоря о синтаксических эквивалентностях, LEFT JOIN = LEFT OUTER JOIN и RiGHT JOIN = RIGHT OUTER JOIN

Biasu 28 июль 2018, в 16:34
Показать ещё 8 комментариев
Quassnoi 19 фев. 2009, в 14:49
Поделиться

Я бы не назвал это синтаксическим сахаром. Тип соединения «по умолчанию», «стенография» или «псевдоним», может быть.

mk12 24 июнь 2015, в 13:32

В информатике синтаксический сахар — это синтаксис в языке программирования, предназначенный для облегчения чтения или выражения . Я считаю, что способность опускать INNER подпадает под это определение.

Quassnoi 24 июнь 2015, в 13:35

Если вы применяете определение буквально, да, но я всегда видел его зарезервированным для более интересных типов синтаксиса, а не только для альтернативных имен вещей.

mk12 25 июнь 2015, в 14:01

@Quassnoi сам факт , что этот вопрос задан, показывает absense из INNER не делает легче читать запрос. Насколько я знаю, JOIN вполне может означать LEFT JOIN если это не выяснено ответами здесь.

martennis 29 июнь 2017, в 11:50
Показать ещё 2 комментария

INNER JOIN является по умолчанию, если вы не укажете тип при использовании слова JOIN.

Вы также можете использовать LEFT OUTER JOIN или RIGHT OUTER JOIN, и в этом случае слово OUTER является необязательным, или вы можете указать CROSS JOIN.

Для внутреннего соединения синтаксис:

SELECT.
FROM TableA
[INNER] JOIN TableB

(другими словами, ключевое слово «INNER» необязательно — результаты одинаковы с или без него)

net_prog 28 фев. 2012, в 08:46
Поделиться

Точно так же, как и OUTER JOINs , слово «OUTER» является необязательным. Это ключевое слово LEFT или RIGHT которое делает JOIN «OUTER» JOIN .

Однако по какой-то причине я всегда использую «OUTER» как в LEFT OUTER JOIN и никогда не LEFT JOIN , но я никогда не использую INNER JOIN , но я просто использую «JOIN» :

SELECT ColA, ColB, . FROM MyTable AS T1 JOIN MyOtherTable AS T2 ON T2.ID = T1.ID LEFT OUTER JOIN MyOptionalTable AS T3 ON T3.ID = T1.ID 

Kristen 19 фев. 2009, в 15:55
Поделиться

Я противоположность вам: я всегда говорю «ВНУТРЕННЕЕ СОЕДИНЕНИЕ», но я никогда не использую ВНЕШНЕЕ; так что «LEFT JOIN» и «RIGHT JOIN». Думаю, я просто сохраняю количество своих персонажей постоянным!

Stephen Holt 07 март 2012, в 10:27
Таким образом, вы не можете иметь левое или правое внутреннее соединение?
Jonathan. 08 май 2014, в 19:29

@ Джонатан. На внутреннем соединении нет понятия направления. Внешние объединения могут давать несопоставимые наборы результатов, которые могут различаться в зависимости от направления. Внутренний требует соответствия, поэтому направление не имеет значения.

Karl Kieninger 01 май 2015, в 17:51
Показать ещё 1 комментарий

Отличается ли это между различными реализациями SQL?

Да, Microsoft Access не позволяет просто join . Это требует inner join .

Michał Powaga 15 май 2012, в 14:35
Поделиться

Как уже было сказано в других ответах, в вашем примере нет разницы.

Соответствующий бит грамматики задокументирован здесь

 ::= [ < INNER | < < LEFT | RIGHT | FULL >[ OUTER ] > > [ ] ] JOIN 

Показывается, что все являются необязательными. На странице далее разъясняется, что

INNER Указывает, что возвращаются все соответствующие пары строк. Выбрасывает непревзойденные строки из обеих таблиц. Если тип соединения не указан, это по умолчанию.

В грамматике также указывается, что есть один раз, когда требуется INNER . При указании подсказки соединения.

CREATE TABLE T1(X INT); CREATE TABLE T2(Y INT); SELECT * FROM T1 LOOP JOIN T2 ON X = Y; SELECT * FROM T1 INNER LOOP JOIN T2 ON X = Y; 

Изображение 4037

Martin Smith 02 авг. 2015, в 18:01
Поделиться

INNER = INNER JOIN, но когда вы пишете INNER JOIN — вы можете провести аналогию с Sets From Math, поэтому INNER JOIN является пересечением в диаграмме Венна. Таким образом, INNER JOIN более интуитивно понятен, чем JOIN для новичка, в смысле того, что на самом деле делают ключевое слово INNER JOIN против ключевого слова JOIN, и вы можете узнать разницу между INNER JOIN и OUTER JOIN гораздо проще.
Пример ВНУТРЕННЕГО СОЕДИНЕНИЯ Изображение 4038 Изображение 4039 Изображение 4040 Изображение 4041 Изображение 4042Пример ПРАВИЛЬНОГО ВНЕШНЕГО СОЕДИНЕНИЯ

leonidaa 17 янв. 2019, в 15:18
Поделиться

Ещё вопросы

  • 0 Использование баров из Google-графиков в качестве кнопок
  • 0 Как передать данные JSON из контроллера C # в угловой JS?
  • 1 Хранимая процедура Oracle возвращает RefCursor без строк
  • 0 preg_replace для сопоставления шаблона с любой стороны селектора
  • 0 Codeigniter — перенаправить и скачать файл
  • 1 Как я могу получить доступ к объекту, связанному с LiveData, вне наблюдателя?
  • 0 Безопасные / небезопасные проблемы загрузки jQuery CDN
  • 0 HTML-функция вызова JavaScript при загрузке
  • 0 AngularJS — Форма с элементом Select для получения идентификатора из другого объекта
  • 1 Эффективно получить перестановку 3-х рядных массивов разных размеров и типов
  • 0 Codeigniter Pagination начинается с другой страницы и другой активной ссылки для разных сотрудников, в то время как код один и тот же
  • 1 Как преобразовать дату, которую пользователь выбирает в формате MM-дд-гггг, в формат гггг-мм-дд в Java
  • 0 получение данных с сервера в формате xml
  • 0 Преобразовать целое число в формат времени, чтобы вы могли рассчитать разницу во времени с ним
  • 0 Как можно передать идентификатор с одного маршрутизатора на другой в Node.js
  • 1 Как сделать резервную копию всех ключей реестра Windows в C #
  • 0 используя дублированные переменные JavaScript
  • 1 HTTP-обработчик без ответа
  • 0 ‘SQLSTATE [HY093], я неправильно поставил запятую?
  • 0 $ _POST в пределах heredoc php
  • 1 Как обеспечить непосредственную ссылку на объект при создании экземпляра?
  • 1 Настройки парсера DOM, чтобы избежать атаки XML Injection
  • 1 Java: байт [1] против байта [1024]
  • 1 Проходя Tuple для просмотра, просматривайте результаты
  • 0 AngularJS кликает только на небольших разрешениях
  • 0 Получение Visual Studio, чтобы увидеть мое пространство имен
  • 1 Очень простая проблема с массивами, циклами и логическим сравнением
  • 1 Позвоните класс для рецептов Minecraft
  • 1 Как правильно читать строки в формате csv и преобразовывать их в столбцы данных, используя панд?
  • 0 Горизонтальная прокрутка изображения с помощью запроса
  • 0 функция slideToggle работает отдельно
  • 0 Получить геометрические кординаты из таблицы Oracle
  • 1 Как получить доступ к нескольким ресурсам xsl для тега int-xml: xslt-transformer?
  • 0 Как лучше всего вставить данные в таблицу при отправке формы?
  • 1 Открытая студия Talend — как перейти к следующему шагу
  • 0 Наложение CSS не работает
  • 1 Папка Temp в устройствах Pixel 2
  • 1 Visual Studio: ошибка указанного пути не поддерживается
  • 0 Адаптер публичных функций в с ++ — хорошо? Плохо? даже реальная картина?
  • 1 Записать строку с символами новой строки в файл
  • 0 Вызов неопределенной функции curl_init () в wampp
  • 0 CMake, когда используете FindFoo.cmake или FooConfig.cmake (и другие уточнения)
  • 1 Фильтрация слов в элементах списка по текстовому полю
  • 0 phpmailer занимает 5 секунд .. пока php mail () занимает меньше 1
  • 0 JavaScript / jQuery — как найти первый из каждого неопределенного класса в родительском div
  • 1 Узел JS Как отправить изображение вместе с запросом данных на другой сервер / API
  • 1 Вызов метода из Native dll работает в первый раз, сбои во второй раз (из-за модулей fortran)?
  • 1 «Java.io.FileNotFoundException (нет такого файла или каталога)»
  • 0 Angular JS Force для перезагрузки iframe
  • 0 Поведение компилятора для целочисленных указателей на необъявленную память

JOIN и INNER JOIN в SQL: различие и влияние на производительность

В SQL JOIN и INNER JOIN выполняют идентичные действия; оба оператора возвращают строки, в которых совпадают записи в обеих сопоставляемых таблицах. Проще сказать, эти операторы работают одинаково:

Скопировать код

-- Будь то гол, забитый в основное время SELECT * FROM table1 JOIN table2 ON table1.id = table2.id; -- Или гол, забитый в дополнительное время SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

Сущность этих запросов заключается в поиске соответствующих значений таблиц, исходя из определённых критериев, в нашем случае: table1.id = table2.id .

Ориентиры в джунглях SQL

Упоминание INNER JOIN в SQL-запросах, особенно когда испытываются сложности с множеством различных типов соединений, вы даете ориентиры для тех, кто будет препирать ваши запросы. Такой подход является наиболее полезным для командной работы, либо когда вы возвращаетесь к собственному SQL-коду через год и стараетесь в нём разобраться.

Скопировать код

-- Включаем режим искателя приключений в SQL, не забудьте пристегнуть ремни безопасности! SELECT orders.order_id, customers.name, products.product_name, order_details.quantity FROM customers INNER JOIN orders ON customers.customer_id = orders.customer_id INNER JOIN order_details ON orders.order_id = order_details.order_id INNER JOIN products ON products.product_id = order_details.product_id;

Явное использование INNER JOIN даёт возможность чётко и однозначно передать ваше намерение, минимизируя любую вероятность неправильной интерпретации.

Влияние диалекта SQL на синтаксис соединений

Хотя в SQL JOIN и INNER JOIN считаются взаимозаменяемыми, имеются нюансы, как, например, в Microsoft Access, где требуется явное использование INNER JOIN . Эти подводные камни синтаксиса могут повлиять на ваш выбор при написании запросов.

Развенчание мифов о производительности

Среди практиков SQL существует мнение, что выбор синтаксиса (неявный JOIN против явного INNER JOIN ) может влиять на производительность запроса. Однако это не совсем верно. Системы управления базами данных обрабатывают JOIN и INNER JOIN одинаково. Ключевую роль в производительности играют корректно составленные условия соединения и эффективное использование индексов.

Выбор синтаксиса соединений: сальса или танго?

Выбор между JOIN и INNER JOIN часто обусловлен личными предпочтениями или привычками команды. Как в танце, здесь важна последовательность. Соблюдение общих правил написания кода значительно облегчает процесс понимания и помогает создать гармоничный код. Это подчёркивает необходимость ведения стилевого справочника SQL для команды, действующего аналогично роли хореографа, координирующего движения танцоров.

Какая разница между правым и левым JOIN’ом?

Этот вопрос любят задавать на собеседованиях на позицию джуниора в IT-компаниях. Это, если хотите, классика жанра. Что же, давайте разбираться, в чём разница между SQL-запросами RIGHT и LEFT JOIN. Заодно, вспомним и запрос INNER JOIN.

Примечание: в статье описываются базовые случаи для общего понимания. В зависимости от конкретной базы данных возможны нюансы.

Внутреннее соединение INNER JOIN

С помощью этого запроса вы возвратите все записи из таблиц table_1 и table_2, которые связаны с помощью первичного (primary) и внешнего (foreign) ключей, а также отвечающие условию WHERE для таблицы table_1.

Если в какой-нибудь из вышеописанных таблиц отсутствует запись, которая соответствует соседней, эта пара не будет включена в общую выдачу. Таким образом, мы получим лишь те записи, которые существует как в первой, так и во второй таблицах. По сути, выборка осуществляется по наличию связи (ключу), то есть выдаются лишь записи, связанные между собой. Если у вас есть «одинокие» записи (записи без пары), то они выданы не будут.

 
SELECT * FROM table_1 INNER JOIN table_2 ON table_1.primary_key = table_2.foreign_key WHERE table_1.column_1 = ‘value’

Внешнее соединение LEFT JOIN

С помощью этого запроса вы вернёте все данные из «левой» таблицы даже в том случае, если не будет найдено соответствий в «правой» таблице. Подразумевается, что «левая» таблица в запросе находится левее знака равно, а «правая», соответственно, правее (стандартная логика правой и левой руки).

Говоря иначе, когда мы присоединяем «правую» таблицу к «левой», происходит выборка всех записей согласно условиям WHERE для «левой» таблицы. Если в «правой» таблице у нас отсутствуют соответствующие записи по ключам, они вернутся как NULL. В результате главной выступает именно «левая» таблица, и именно относительно неё осуществляется выдача. При этом в условии ON «левая» таблица прописывается первой по порядку (table_1), а «правая» – второй (table_2):

 
SELECT * FROM table_1 LEFT JOIN table_2 ON table_1.primary_key = table_2.foreign_key WHERE table_1.column_1 = ‘value’

Внешнее соединение RIGHT JOIN

Используя этот запрос, вы вернёте все данные из «правой» таблицы даже в том случае, если не будут найдены соответствия в «левой» таблице. То есть всё происходит по аналогии с LEFT JOIN, однако NULL вернётся для полей «левой» таблицы. Иными словами, главной выступает именно правая «таблица» и выдача осуществляется относительно неё. Также обратите внимание на WHERE, т. к. условие выборки теперь затрагивает «правую» таблицу:

 
SELECT * FROM table_1 RIGHT JOIN table_2 ON table_1.primary_key = table_2.foreign_key WHERE table_2.column_1 = ‘value’

В двух словах:

  • LEFT JOIN — это абсолютно всё из левой таблицы, плюс то, что нашлось в правой (то, что удовлетворяет выражению ON). Если не нашлось в правой, то напротив записи из левой будет NULL;
  • RIGHT JOIN — наоборот;
  • INNER JOIN — только те записи из левой и правой таблиц, которые удовлетворяют выражению ON (в обеих таблицах NULL недопустим);
  • FULL JOIN — всё вместе.

Совет

Лучше всего разбираться с этими запросами на практике. Для этого создайте соответствующую базу данных и таблицы в ней. Это не займёт много времени. К примеру, вы можете попрактиковаться с помощью этого видеоурока. Только «потрогав» всё руками, вы действительно поймёте, какова разница между правым и левым JOIN’ом.

SQL inner и outer Join

SQL — В чем разница между внутренним join и внешним join

1 min read
Dec 1, 2019

Самый лучший и простой способ понять соединения:

INNER JOIN возвращает все записи, которые являются общими для обеих таблиц на основе внешнего ключа.

LEFT JOIN получает все записи из связанной таблицы LEFT, но если вы выбрали несколько столбцов из таблицы RIGHT, если нет связанных записей, эти столбцы будут содержать NULL.

RIGHT JOIN похож на вышеприведенный, но получает все записи в таблице RIGHT.

FULL JOIN получает все записи из обеих таблиц и помещает NULL в столбцы, где связанные записи не существуют в противоположной таблице.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *