0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: базы данных, sql, запросы, таблицы, left join, right join, inner join, соединения</p>
1
<p>Теги: базы данных, sql, запросы, таблицы, left join, right join, inner join, соединения</p>
2
<p>Этот вопрос любят задавать на собеседованиях на позицию джуниора в IT-компаниях. Это, если хотите, классика жанра. Что же, давайте разбираться, в чём разница между SQL-запросами RIGHT и LEFT JOIN. Заодно, вспомним и запрос INNER JOIN.</p>
2
<p>Этот вопрос любят задавать на собеседованиях на позицию джуниора в IT-компаниях. Это, если хотите, классика жанра. Что же, давайте разбираться, в чём разница между SQL-запросами RIGHT и LEFT JOIN. Заодно, вспомним и запрос INNER JOIN.</p>
3
<p>Примечание: в статье описываются базовые случаи для общего понимания. В зависимости от конкретной базы данных возможны нюансы.</p>
3
<p>Примечание: в статье описываются базовые случаи для общего понимания. В зависимости от конкретной базы данных возможны нюансы.</p>
4
<h2>Внутреннее соединение INNER JOIN</h2>
4
<h2>Внутреннее соединение INNER JOIN</h2>
5
<p>С помощью этого запроса вы возвратите все записи из таблиц table_1 и table_2, которые связаны с помощью первичного (primary) и внешнего (foreign) ключей, а также отвечающие условию WHERE для таблицы table_1.</p>
5
<p>С помощью этого запроса вы возвратите все записи из таблиц table_1 и table_2, которые связаны с помощью первичного (primary) и внешнего (foreign) ключей, а также отвечающие условию WHERE для таблицы table_1.</p>
6
<p>Если в какой-нибудь из вышеописанных таблиц отсутствует запись, которая соответствует соседней, эта пара не будет включена в общую выдачу. Таким образом, мы получим лишь те записи, которые существует как в первой, так и во второй таблицах. По сути, выборка осуществляется по наличию связи (ключу), то есть выдаются лишь записи, связанные между собой. Если у вас есть "одинокие" записи (записи без пары), то они выданы не будут.</p>
6
<p>Если в какой-нибудь из вышеописанных таблиц отсутствует запись, которая соответствует соседней, эта пара не будет включена в общую выдачу. Таким образом, мы получим лишь те записи, которые существует как в первой, так и во второй таблицах. По сути, выборка осуществляется по наличию связи (ключу), то есть выдаются лишь записи, связанные между собой. Если у вас есть "одинокие" записи (записи без пары), то они выданы не будут.</p>
7
SELECT * FROM table_1 INNER JOIN table_2 ON table_1.primary_key = table_2.foreign_key WHERE table_1.column_1 = ‘value’<h2>Внешнее соединение LEFT JOIN</h2>
7
SELECT * FROM table_1 INNER JOIN table_2 ON table_1.primary_key = table_2.foreign_key WHERE table_1.column_1 = ‘value’<h2>Внешнее соединение LEFT JOIN</h2>
8
<p>С помощью этого запроса вы вернёте все данные из "левой" таблицы даже в том случае, если не будет найдено соответствий в "правой" таблице. Подразумевается, что "левая" таблица в запросе находится левее знака равно, а "правая", соответственно, правее (стандартная логика правой и левой руки).</p>
8
<p>С помощью этого запроса вы вернёте все данные из "левой" таблицы даже в том случае, если не будет найдено соответствий в "правой" таблице. Подразумевается, что "левая" таблица в запросе находится левее знака равно, а "правая", соответственно, правее (стандартная логика правой и левой руки).</p>
9
<p>Говоря иначе, когда мы присоединяем "правую" таблицу к "левой", происходит выборка всех записей согласно условиям WHERE для "левой" таблицы. Если в "правой" таблице у нас отсутствуют соответствующие записи по ключам, они вернутся как NULL. В результате<strong>главной выступает именно "левая" таблица</strong>, и именно относительно неё осуществляется выдача. При этом в условии ON "левая" таблица прописывается первой по порядку (table_1), а "правая" - второй (table_2):</p>
9
<p>Говоря иначе, когда мы присоединяем "правую" таблицу к "левой", происходит выборка всех записей согласно условиям WHERE для "левой" таблицы. Если в "правой" таблице у нас отсутствуют соответствующие записи по ключам, они вернутся как NULL. В результате<strong>главной выступает именно "левая" таблица</strong>, и именно относительно неё осуществляется выдача. При этом в условии ON "левая" таблица прописывается первой по порядку (table_1), а "правая" - второй (table_2):</p>
10
SELECT * FROM table_1 LEFT JOIN table_2 ON table_1.primary_key = table_2.foreign_key WHERE table_1.column_1 = ‘value’<h2>Внешнее соединение RIGHT JOIN</h2>
10
SELECT * FROM table_1 LEFT JOIN table_2 ON table_1.primary_key = table_2.foreign_key WHERE table_1.column_1 = ‘value’<h2>Внешнее соединение RIGHT JOIN</h2>
11
<p>Используя этот запрос, вы вернёте все данные из "правой" таблицы даже в том случае, если не будут найдены соответствия в "левой" таблице. То есть всё происходит по аналогии с LEFT JOIN, однако NULL вернётся для полей "левой" таблицы. Иными словами,<strong>главной выступает именно правая "таблица"</strong>и выдача осуществляется относительно неё. Также обратите внимание на WHERE, т. к. условие выборки теперь затрагивает "правую" таблицу:</p>
11
<p>Используя этот запрос, вы вернёте все данные из "правой" таблицы даже в том случае, если не будут найдены соответствия в "левой" таблице. То есть всё происходит по аналогии с LEFT JOIN, однако NULL вернётся для полей "левой" таблицы. Иными словами,<strong>главной выступает именно правая "таблица"</strong>и выдача осуществляется относительно неё. Также обратите внимание на WHERE, т. к. условие выборки теперь затрагивает "правую" таблицу:</p>
12
SELECT * FROM table_1 RIGHT JOIN table_2 ON table_1.primary_key = table_2.foreign_key WHERE table_2.column_1 = ‘value’<h2>В двух словах:</h2>
12
SELECT * FROM table_1 RIGHT JOIN table_2 ON table_1.primary_key = table_2.foreign_key WHERE table_2.column_1 = ‘value’<h2>В двух словах:</h2>
13
<ul><li>LEFT JOIN - это абсолютно всё из левой таблицы, плюс то, что нашлось в правой (то, что удовлетворяет выражению ON). Если не нашлось в правой, то напротив записи из левой будет NULL;</li>
13
<ul><li>LEFT JOIN - это абсолютно всё из левой таблицы, плюс то, что нашлось в правой (то, что удовлетворяет выражению ON). Если не нашлось в правой, то напротив записи из левой будет NULL;</li>
14
<li>RIGHT JOIN - наоборот;</li>
14
<li>RIGHT JOIN - наоборот;</li>
15
<li>INNER JOIN - только те записи из левой и правой таблиц, которые удовлетворяют выражению ON (в обеих таблицах NULL недопустим);</li>
15
<li>INNER JOIN - только те записи из левой и правой таблиц, которые удовлетворяют выражению ON (в обеих таблицах NULL недопустим);</li>
16
<li>FULL JOIN - всё вместе.</li>
16
<li>FULL JOIN - всё вместе.</li>
17
</ul><h2>Совет</h2>
17
</ul><h2>Совет</h2>
18
<p>Лучше всего разбираться с этими запросами на практике. Для этого создайте соответствующую базу данных и таблицы в ней. Это не займёт много времени. К примеру, вы можете попрактиковаться с помощью<a>этого видеоурока</a>. Только "потрогав" всё руками, вы действительно поймёте, какова разница между правым и левым JOIN’ом.</p>
18
<p>Лучше всего разбираться с этими запросами на практике. Для этого создайте соответствующую базу данных и таблицы в ней. Это не займёт много времени. К примеру, вы можете попрактиковаться с помощью<a>этого видеоурока</a>. Только "потрогав" всё руками, вы действительно поймёте, какова разница между правым и левым JOIN’ом.</p>
19
19