LEFT JOIN и строки без пары
128 мин
INNER JOIN молча выбрасывает строки без пары. Но часто интересны именно они: «покупатели, которые ни разу не заказывали», «группы без куратора», «студенты, ещё не получившие оценок».
LEFT JOIN
Остаются все строки левой таблицы. Если пары в правой таблице нет — её столбцы будут NULL.
У групп без куратора curator — NULL.
Поиск строк без пары
Самый полезный приём: LEFT JOIN + WHERE правая.id IS NULL.
Это покупатели, которые ни разу ничего не заказали.
RIGHT JOIN и FULL JOIN
RIGHT JOIN— зеркальное отражениеLEFT JOIN: полностью остаётся правая таблица. Обычно понятнее поменять таблицы местами и написатьLEFT JOIN.FULL JOIN— остаются строки без пары с обеих сторон.
PostgreSQL поддерживает FULL OUTER JOIN.
Осторожно: условие в WHERE или в ON?
Если в LEFT JOIN условие для правой таблицы написать в WHERE, строки без пары (NULL) условие не пройдут — и LEFT JOIN превратится в обычный JOIN. Условие на правую таблицу должно стоять в ON:
COUNT(o.id) не считает NULL, поэтому у покупателя без отменённых заказов будет 0.
Выведите названия товаров, на которые не написано ни одного отзыва (reviews).
Выведите название каждого факультета и число преподавателей на нём. Если преподавателей нет, должно быть 0.
Запомните
LEFT JOIN— левая таблица остаётся полностью, у строк без пары правая сторонаNULL.- Строки без пары:
LEFT JOIN … WHERE правая.id IS NULL. - Условие на правую таблицу — в
ON, иначеLEFT JOINперестанет работать.