Когда следует использовать INNER, LEFT и RIGHT JOIN в MySQL?

16.02.2016

В чем же разница между INNER, LEFT и RIGHT JOIN?

В данной статье я раскрою разницу между SQL-запросами INNER, LEFT и RIGHT 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 (левое объединение)

Возвращаются все данные из «левой» таблицы, даже если не найдено соответствий в «правой» таблице («левая» таблица в SQL-запросе стоит левее знака равно, «правая» — правее, то есть обычная логика правой и левой руки).

Иными словами, если мы присоединяем к «левой» таблице «правую», то выберутся все записи в соответствии с условиями 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 для правой таблицы.

Обратите внимание на WHERE в следующем примере, условие выборки затрагивает «правую» таблицу:

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

FULL OUTER JOIN (внешнее полное объединение)

В MySQL отсутствует механизм внешнего полного объединения из коробки.

Поэтому мы может просто объединить LEFT JOIN и RIGHT JOIN и через UNION (без дубликатов - UNION ALL) протестировать такой запрос:

SELECT * FROM table_1
    LEFT JOIN table_2 ON table_1.primary_key = table_2.foreign_key
        UNION ALL
SELECT * FROM t1
    RIGHT JOIN table_2 ON table_1.primary_key = table_2.foreign_key
WHERE table_1.primary_key IS NULL

Для простоты понимания нашел на просторах интернета простую и наглядную картинку:


Тэги: