DEV Community

faangmaster
faangmaster

Posted on

1

Типы 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

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read full post →

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more