Найти тему
Налейте аналитику

Поговорим о JOIN-ах

Оператор JOIN в SQL используется для объединения таблиц и получения результатов запроса из нескольких таблиц разом. Синтаксис запроса с участием JOIN-а двух таблиц, а также различные виды JOIN-ов можно увидеть на схеме:

-2

Что надо помнить, изучая подобное Эйлеровское представление оператора JOIN?

1. Во-первых, учить все виды JOIN-ов, может, необходимо для экзамена в университете, но для решения реальных задач не нужно. 95% задач на практике решается с использованием INNER JOIN и LEFT JOIN, и уж поверьте, намного лучше досконально разобраться для начала только в этих типах соединений, чем по верхам изучить все, в т.ч. CROSS JOIN (в схеме не упомянут) или тот же FULL OUTER JOIN, а запросы писать попеременно с использованием то LEFT, то RIGHT JOIN-ов. Я, например, когда вижу запросы с RIGHT JOIN-ами, чувствую умственное напряжение сродни тому, которое испытываешь перед пешеходным переходом в Британии или на Кипре: 2-3 секунды уходит на то, чтобы переформатировать свой мозг под необычное движение не в ту сторону )

2. Во вторых, надо помнить степень абстракции, с которой пересекающиеся кружочки отражают действительность при объединении таблиц. Частые ошибки при написании запросов кроются в дублировании данных при
JOIN-ах, про которое некоторые забывают, и подобные детали на кругах Эйлера не отобразить никак.

Рассмотрим на конкретных примерах.

-3

Пусть есть табличка с книгами и их скачиваниями (books) и табличка с авторами этих книг (authors). На что стоит обратить внимание:

1. В таблице
books есть книга "Сказки народов мира", у которой нет соответствия в таблице authors

2. У книги "Чудо-пилюли" из таблицы books есть 2 соответствия в таблице authors.

Результат JOIN-а нескольких таблиц - это таблица. И для избежания ошибок в запросах необходимо научиться мысленно визуализировать эту таблицу и понимать ее состав полей и особенности.

Держим в голове 2 пункта выше. Так как использован INNER JOIN, в результирующей таблице будут только те строки, которые есть в обеих таблицах, к которым написан запрос. Соответственно, книги "Сказки народов мира" в результате не будет. А книга "Чудо-пилюли" займет в результате 2 строки, т.к. соответствие в исходных таблицах для этой книги один-к-двум.

Эти детали очень важно помнить. Потому что если бы задача была просуммировать
downloads каждой книги, то запрос

SELECT books.id, books.title, SUM(books.downloads)

FROM books

INNER JOIN authors ON books.id = authors.book_id

GROUP BY books.id

для книги с 2 авторами выдал бы не 200 скачиваний, а 400. Потому что операции проводятся с результирующей таблицей, в которой у книги "Чудо-пилюли" 2 строки и суммарно 400 скачиваний.

Напоследок приложу результат того же запроса, только с использованием не INNER JOIN, а LEFT JOIN:

-4

Как видно, изменилось только одно: книга, у которой не было соответствия в таблице authors, теперь есть в результате, а ее автор заполнился на пустое значение NULL.

Спасибо за прочтение ) подписывайтесь на
телеграм