HTML Diff
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