DEV Community

faangmaster
faangmaster

Posted on

Типы SQL joins

Очень частый вопрос с собеседования на программиста: Какие типы SQL joins вы знаете?
Ответ.
Их 5 типов:
1) INNER JOIN
2) LEFT OUTER JOIN (или просто LEFT JOIN)
3) RIGHT OUTER JOIN (или просто RIGHT JOIN)
4) FULL OUTER JOIN (или просто FULL JOIN)
5) CROSS JOIN

Рассмотрим их более подробно на примере. Допустим у нас есть две таблицы, которые мы хотим сджойнить:
1) clients. Которая содержит информацию о клиентах вашего интернет магазина. В ней содеожится id клиента и его имя:

Image description
2) orders. Она содержит информацию о заказах клинтов. Какой клиент (client_id) и на какую сумму был заказ:

Image description

Давайте теперь сделаем все 5 типов JOINS по client_id и посмотрим какие мы получим результаты:

1) INNER JOIN. Он вернет только строки из обоих таблиц, которые удовлетворяют предикату (условию) нашего джойна. Т.е. те строки для которых clients.id = orders.client_id:

select * from clients c INNER JOIN orders r ON c.id = r.client_id
Enter fullscreen mode Exit fullscreen mode

Image description

Как мы видим у нас нет строки с Vanya, т.к. он не делал заказы. Также у нас две строки с Vasya, т.к. он делал два заказа.

На языке множест это соответствует пересечению двух множест: множеству клиентов и заказов.

Image description

2) LEFT JOIN. Результат будет содержать все строки из первой (левой таблицы), если не было найдено соответствущей строки в правой таблице, то поля второй таблицы будут дополнены NULL.

select * from clients c LEFT OUTER JOIN orders r ON c.id = r.client_id
Enter fullscreen mode Exit fullscreen mode

Image description
Как мы видим результат повторяет результат INNER JOIN + содержит строку Vanya дополненую NULL с информацией о заказах.
На языке множеств это выглядит так:

Image description

3) RIGHT JOIN. Аналогично LEFT JOIN, но результат содержит все строки из правой таблицы и дополняется NULL если нет соотвествующей строки в левой таблице.

select * from clients c RIGHT OUTER JOIN orders r ON c.id = r.client_id
Enter fullscreen mode Exit fullscreen mode

Image description

На языке множеств:

Image description

4) FULL OUTER JOIN. Результат содержит строки, которые заматчились по условию джойна, а также все оставшиеся строки левой таблицы, которые не заматчились с дополненными полями правой таблицы заполенные NULL + оставшиеся строки правой таблицы с дополненными NULL полями левой таблицы.

select * from clients c FULL OUTER JOIN orders r ON c.id = r.client_id
Enter fullscreen mode Exit fullscreen mode

Image description

На языке множеств:

Image description

5) CROSS JOIN. Сджойнит каждую строку из первой таблицы с каждой строкой из второй таблицы. Т.е если у нас в первой таблице n строк, а во второй m, то результат будет содержать n * m строк.

select * from clients c CROSS JOIN orders r
Enter fullscreen mode Exit fullscreen mode

Image description

Top comments (0)