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

от admin

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

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

Различия между различными реализациями SQL?

8 ответов

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

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

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

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

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

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

SELECT.
FROM TableA
[INNER] JOIN TableB

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

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

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

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

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

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

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

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

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

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

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

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Пример ПРАВИЛЬНОГО ВНЕШНЕГО СОЕДИНЕНИЯ

What are SQL Joins?

A SQL JOIN is used when you want to combine a row of records from multiple tables based on a common column value between the records.

A side note before moving forward: This blog post assumes you know basic SQL syntax, and have a general understand of relational databases. This isn’t some super technical read, but I thought it would be useful to align expectations up front.

What does that mean?

Well let’s say you have two tables in your database: users and comments.

The database schema is set up so that there is a one:many relationship. A user can have zero, or more comments. This means for each user record there is either zero, one, or many comments records that have a foreign key column that points to that users record primary key column.

If you want to visualize that here is a glorious diagram:

For reference we can say our database currently looks like so:

If your goal is to return data from your database where you want to organize each user with the comments they made that is the perfect use case for a SQL JOIN.

I wonder what that translates to in SQL code.

Wonder no more. Here you go:

The ON clause contains the condition in which to join the rows of records with each other.

In this case for every record in users where the id column is equal to the user_id column for a comment the name of the user will be returned along with the body of the comment. These columns will be joined together in a single row like so:

Types of Joins

1. Inner Join (aka JOIN)

The first (and most common) type of JOIN I’ll talk about is an INNER JOIN. Is is sometimes referred to as a Simple JOIN, or just JOIN.

An INNER JOIN will return rows of data on both sides of the join based on the condition specified in the ON clause. If the records do not satisfy this clause they will not be returned.

When Would I Use An INNER JOIN?

An INNER JOIN is demonstrated in the introduction section above. If you look at the results of the query you will notice that the user Cynthia is not returned because she does not have any associated comments.

A user with no comments will not be returned by the query. Similarly a comment that does not belong to a user will not have its record returned either.

So when should you use it? When you require your query to return data in a situation that is similar to the above. That is if you only want rows of data that are returned, and joined where both need to satisfy a certain condition.

2. Left Join (aka Left Outer Join)

A LEFT JOIN, also know as a LEFT OUTER JOIN will return all records from the table specified in the FROM clause (the left table), joined with records from the right table that satisfy the ON clause.

This means that there may (and probably will be) rows of records returned where the record from the left table is not joined with an associated record from the right table.

Here’s a query that does just that:

And here is the data returned by our database:

The query above returns the name of each user as well as how many comments they have made.

Contrary to the INNER JOIN from above LEFT JOIN returned ALL the values for the name column in ever user record even if that user did not have a comment. This is demonstrated by the fact that Cynthia was returned, but her comment_count is zero.

When Should I Use A LEFT JOIN?

When you need to all records from the left table, and you only want to join those rows with records in the right table that satisfy the condition in the ON clause.

3. Right Join (aka Right Outer Join)

A RIGHT JOIN, also know as a RIGHT OUTER JOIN is essentially the exact opposite of a LEFT JOIN. Because of this I won’t go in to any additional detail about it.

When Should I Use A RIGHT JOIN?

When you need to all records from the right table, and you only want to join those rows with records in the left table that satisfy the condition in the ON clause.

4. Cross Join

A CROSS JOIN, also know as a CARTESIAN JOIN will return all records from both tables where for every record in one table it is joined together in a row with every record from the other table.

Читать:
Как узнать ответы на цдз

Stated another way a CROSS JOIN is essentially an INNER JOIN without the condition to evaluate in the ON clause.

Heres an example using the existing sample database from the previous three joins:

And here is the result of that query:

As you can see for every user record the users name is joined in a row with the body of every comment.

Until Next Time

That’s it! I hope this brief tour of SQL JOINs shed some light as to what they do.

If you feel anything here was inaccurate, or could use some clarification please let me know!

Понимание джойнов сломано. Это точно не пересечение кругов, честно

Так получилось, что я провожу довольно много собеседований на должность веб-программиста. Один из обязательных вопросов, который я задаю — это чем отличается INNER JOIN от LEFT JOIN.

Чаще всего ответ примерно такой: «inner join — это как бы пересечение множеств, т.е. остается только то, что есть в обеих таблицах, а left join — это когда левая таблица остается без изменений, а от правой добавляется пересечение множеств. Для всех остальных строк добавляется null». Еще, бывает, рисуют пересекающиеся круги.

Я так устал от этих ответов с пересечениями множеств и кругов, что даже перестал поправлять людей.

Дело в том, что этот ответ в общем случае неверен. Ну или, как минимум, не точен.

Давайте рассмотрим почему, и заодно затронем еще парочку тонкостей join-ов.

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

(Update. В комментах идут жаркие споры о теории множеств и уникальности. Очень интересно, много нового узнал, спасибо)

INNER JOIN

Давайте сразу пример.

Итак, создадим две одинаковых таблицы с одной колонкой id, в каждой из этих таблиц пусть будет по две строки со значением 1 и еще что-нибудь.

Давайте, их, что ли, поджойним

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

На практике ответ будет такой:

Для начала рассмотрим, что такое CROSS JOIN. Вдруг кто-то не в курсе.

CROSS JOIN — это просто все возможные комбинации соединения строк двух таблиц. Например, есть две таблицы, в одной из них 3 строки, в другой — 2:

Тогда CROSS JOIN будет порождать 6 строк.

Так вот, вернемся к нашим баранам.
Конструкция

— это, можно сказать, всего лишь синтаксический сахар к

Т.е. по сути INNER JOIN — это все комбинации соединений строк с неким фильтром condition . В общем-то, можно это представлять по разному, кому как удобнее, но точно не как пересечение каких-то там кругов.

Небольшой disclaimer: хотя inner join логически эквивалентен cross join с фильтром, это не значит, что база будет делать именно так, в тупую: генерить все комбинации и фильтровать. На самом деле там более интересные алгоритмы.

LEFT JOIN

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

Опять же, создадим две таблицы:

Теперь сделаем LEFT JOIN:

Результат будет содержать 5 строк, а не по количеству строк в левой таблице, как думают очень многие.

Так что, LEFT JOIN — это тоже самое что и INNER JOIN (т.е. все комбинации соединений строк, отфильтрованных по какому-то условию), и плюс еще записи из левой таблицы, для которых в правой по этому фильтру ничего не совпало.

LEFT JOIN можно переформулировать так:

Сложноватое объяснение, но что поделать, зато оно правдивее, чем круги с пересечениями и т.д.

Условие ON

Удивительно, но по моим ощущениям 99% разработчиков считают, что в условии ON должен быть id из одной таблицы и id из второй. На самом деле там любое булево выражение.

Например, есть таблица со статистикой юзеров users_stats, и таблица с ip адресами городов.
Тогда к статистике можно прибавить город

где && — оператор пересечения (см. расширение посгреса ip4r)

Если в условии ON поставить true, то это будет полный аналог CROSS JOIN

Производительность

Есть люди, которые боятся join-ов как огня. Потому что «они тормозят». Знаю таких, где есть полный запрет join-ов по проекту. Т.е. люди скачивают две-три таблицы себе в код и джойнят вручную в каком-нибудь php.

Это, прямо скажем, странно.

Если джойнов немного, и правильно сделаны индексы, то всё будет работать быстро. Проблемы будут возникать скорее всего лишь тогда, когда у вас таблиц будет с десяток в одном запросе. Дело в том, что планировщику нужно определить, в какой последовательности осуществлять джойны, как выгоднее это сделать.

Сложность этой задачи O(n!), где n — количество объединяемых таблиц. Поэтому для большого количества таблиц, потратив некоторое время на поиски оптимальной последовательности, планировщик прекращает эти поиски и делает такой план, какой успел придумать. В этом случае иногда бывает выгодно вынести часть запроса в подзапрос CTE; например, если вы точно знаете, что, поджойнив две таблицы, мы получим очень мало записей, и остальные джойны будут стоить копейки.

Кстати, Еще маленький совет по производительности. Если нужно просто найти элементы в таблице, которых нет в другой таблице, то лучше использовать не ‘LEFT JOIN… WHERE… IS NULL’, а конструкцию EXISTS. Это и читабельнее, и быстрее.

Выводы

Как мне кажется, не стоит использовать диаграммы Венна для объяснения джойнов. Также, похоже, нужно избегать термина «пересечение».

Как объяснить на картинке джойны корректно, я, честно говоря, не представляю. Если вы знаете — расскажите, плиз, и киньте в коменты.

Update В этом видео я наглядно объясняю, как правильно визуализировать джойны (English):

JOIN vs. INNER JOIN and FULL OUTER JOIN

I know there is a difference between INNER JOIN and FULL OUTER JOIN , I can see it, but, what is the difference between the two following: JOIN . ON. and INNER JOIN. ON. and still yet JOIN. ON. vs FULL OUTER JOIN. ON.

Reason being is I think maybe just using JOIN is messing up a query I am working on that is posted on SO, link to question HERE.

So basically what is the syntactical difference between the actual set operations themselves?

MCP_infiltrator's user avatar

2 Answers 2

JOIN and INNER JOIN are the same, the inner keyword is optional as all joins are considered to be inner joins unless otherwise specified. The difference between JOIN and FULL OUTER JOIN is the same as the difference between INNER JOIN and FULL OUTER JOIN .

An INNER JOIN will only return matched rows if a row in table A matches many rows in table B the table A row will be repeated with each table B row and vice versa.

A FULL OUTER JOIN will return everything an inner join does and return all unmatched rows from each table.

Похожие статьи