Очень частый вопрос с собеседования на программиста: Какие типы 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 клиента и его имя:
2) orders. Она содержит информацию о заказах клинтов. Какой клиент (client_id) и на какую сумму был заказ:
Давайте теперь сделаем все 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
Как мы видим у нас нет строки с Vanya, т.к. он не делал заказы. Также у нас две строки с Vasya, т.к. он делал два заказа.
На языке множест это соответствует пересечению двух множест: множеству клиентов и заказов.
2) LEFT JOIN. Результат будет содержать все строки из первой (левой таблицы), если не было найдено соответствущей строки в правой таблице, то поля второй таблицы будут дополнены NULL.
select * from clients c LEFT OUTER JOIN orders r ON c.id = r.client_id
Как мы видим результат повторяет результат INNER JOIN + содержит строку Vanya дополненую NULL с информацией о заказах.
На языке множеств это выглядит так:
3) RIGHT JOIN. Аналогично LEFT JOIN, но результат содержит все строки из правой таблицы и дополняется NULL если нет соотвествующей строки в левой таблице.
select * from clients c RIGHT OUTER JOIN orders r ON c.id = r.client_id
На языке множеств:
4) FULL OUTER JOIN. Результат содержит строки, которые заматчились по условию джойна, а также все оставшиеся строки левой таблицы, которые не заматчились с дополненными полями правой таблицы заполенные NULL + оставшиеся строки правой таблицы с дополненными NULL полями левой таблицы.
select * from clients c FULL OUTER JOIN orders r ON c.id = r.client_id
На языке множеств:
5) CROSS JOIN. Сджойнит каждую строку из первой таблицы с каждой строкой из второй таблицы. Т.е если у нас в первой таблице n строк, а во второй m, то результат будет содержать n * m строк.
select * from clients c CROSS JOIN orders r
Top comments (0)