Оператор OUTER JOIN

Модуль 4. Работа с БД
3 уровень , 3 лекция
Открыта

Причины появления OUTER JOIN

Кстати, помнишь, мы объединяли наши таблицы и у нас пропали задачи по уборке офиса, так как самой уборщицы еще не было?

Если выполнить такой запрос:


SELECT * FROM task

То мы получим такой результат:

id employee_id name deadline
1 1 Исправить багу на фронтенде 2022-06-01
2 2 Исправить багу на бэкенде 2022-06-15
3 5 Купить кофе 2022-07-01
4 5 Купить кофе 2022-08-01
5 5 Купит кофе 2022-09-01
6 (NULL) Убрать офис (NULL)
7 4 Наслаждаться жизнью (NULL)
8 6 Наслаждаться жизнью (NULL)

Задача “Убрать офис” пропадает, если мы попробуем объединить таблицу task с таблицей employee по employee_id.

Чтобы решить эту проблему, в оператор JOIN добавили различные модификаторы, которые позволяют сохранить такие потерянные строки без пары в другой таблице.

Напомню классический вид оператора JOIN:



       
   
       
   
       
   
таблица1 JOIN таблица2 ON условие

Мы можем сказать SQL-серверу, чтобы все данные из левой таблицы (таблица1) обязательно присутствовали в объединенной таблице. Даже если для них нет пары в правой таблице. Для этого всего лишь нужно написать:


таблица1 LEFT JOIN таблица2 ON условие

Если же ты хочешь, чтобы в объединенной таблице обязательно были все строки из правой таблицы, то нужно написать:


таблица1 RIGHT JOIN таблица2 ON
 условие 

Давай напишем запрос, который объединит все задачи и сотрудников, чтобы при этом задачи без исполнителя не терялись. Для этого нужно написать запрос:

SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.employee_id

И результат такого запроса:

id name occupation salary age join_date id employee_id name
1 Иванов Иван Программист 100000 25 2012-06-30 1 1 Исправить багу на фронтенде
2 Петров Петр Программист 80000 23 2013-08-12 2 2 Исправить багу на бэкенде
4 Рабинович Мойша Директор 200000 35 2015-05-12 7 4 Наслаждаться жизнью
5 Кириенко Анастасия Офис-менеджер 40000 25 2015-10-10 3 5 Купить кофе
5 Кириенко Анастасия Офис-менеджер 40000 25 2015-10-10 4 5 Купить кофе
5 Кириенко Анастасия Офис-менеджер 40000 25 2015-10-10 5 5 Купить кофе
6 Васька кот 1000 3 2018-11-11 8 6 Наслаждаться жизнью
(NULL) (NULL) (NULL) (NULL) (NULL) (NULL) 6 (NULL) Убрать офис

В нашу таблицу добавилась еще одна строка, и что интересно в ней очень много значений NULL. Все данные, которые брались из таблицы employee отображаются в виде NULL, так как для задачи “Убрать офис” не нашлось исполнителя из таблицы employee.

Типы JOIN-ов

Всего существует 4 типа JOIN-ов. Они представлены в таблице ниже:

Краткая запись Длинная запись Пояснение
1 JOIN INNER JOIN Только записи, которые есть в таблицах А и Б
2 LEFT JOIN LEFT OUTER JOIN Все строки без пары из таблицы А должны быть
3 RIGHT JOIN RIGHT OUTER JOIN Все строки без пары из таблицы Б должны быть
4 OUTER JOIN FULL OUTER JOIN Все строки баз пар из таблиц А и Б должны быть

Для простоты, если мы представим таблицы в виде множеств, то JOIN можно будет отображать в виде картинки:

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

Вопрос с собеседования

Иногда программистов-новичков на собеседовании валят очень простым вопросом. С учетом наших таблиц его можно сформулировать так:

“Напишите запрос, которые отобразит список всех сотрудников, для которых нет задач”. Сначала попробуем немного перефразировать этот вопрос: “Напишите запрос, которые отобразит список всех сотрудников из таблицы employee, для которых нет задач в таблице task”. Нам нужно получить вот это множество:

Можно решить эту задачу многими способами, но я начну с самых простых: Во-первых, ты можешь объединить наши таблицы с помощью LEFT JOIN, а потом с помощью WHERE исключить все строки, для которых недостающие данные были дополнены NULL-ами.

SELECT * FROM employee e LEFT JOIN task t ON e.id = t.employee_id WHERE t.id IS NULL 

И результат такого запроса:

id name occupation salary age join_date id employee_id name
3 Иванов Сергей Тестировщик 40000 30 2014-01-01 (NULL) (NULL) (NULL)

Единственный минус такого решения, что тут в таблице строки содержат NULL, а нам по условию нужно отобразить список сотрудников.

Для этого нужно или перечислить в SELECT требуемые колонки таблицы employee, или если нужно отобразить их все, то можно написать такую конструкцию:

SELECT e.* FROM employee e, task t 

Полный запрос будет выглядеть так:

SELECT e.* FROM employee e LEFT JOIN task t ON e.id = t.employee_id WHERE t.id IS NULL 

результат такого запроса:

id name occupation salary age join_date
3 Иванов Сергей Тестировщик 40000 30 2014-01-01

Остальные способы остаются вам для домашнего задания. Не хочу лишать вас удовольствия найти их самостоятельно.

1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
Начинаем работать с LEFT JOIN
Начинаем работать с LEFT JOIN
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
LEFT JOIN и WHERE
LEFT JOIN и WHERE
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
Продолжаем с LEFT JOIN и WHERE
Продолжаем с LEFT JOIN и WHERE
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
Знакомимся с RIGHT JOIN
Знакомимся с RIGHT JOIN
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
RIGHT JOIN и WHERE
RIGHT JOIN и WHERE
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
Продолжаем с RIGHT JOIN и WHERE
Продолжаем с RIGHT JOIN и WHERE
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
JOIN и алиасы таблиц
JOIN и алиасы таблиц
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
LEFT JOIN и алиасы колонок
LEFT JOIN и алиасы колонок
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
RIGHT JOIN, алиасы и WHERE
RIGHT JOIN, алиасы и WHERE
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
RIGHT JOIN, алиасы, WHERE и GROUP BY
RIGHT JOIN, алиасы, WHERE и GROUP BY
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
JOIN, алиасы, WHERE, GROUP BY и ORDER BY
JOIN, алиасы, WHERE, GROUP BY и ORDER BY
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
LEFT JOIN, алиасы, WHERE, GROUP BY, ORDER BY и LIMIT
LEFT JOIN, алиасы, WHERE, GROUP BY, ORDER BY и LIMIT
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
Где больше романистов
Где больше романистов
Комментарии (29)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Кирилл Уровень 101
27 мая 2026
берём самые навороченные задачи с точки зрения условия, решаем получилось самостоятельно решить? значит остальные тупо скипайте, ибо время чисто на прочтение условия потратите больше, чем на решение
Виктор Уровень 109
4 сентября 2025
В разделе: Типы JOIN-ов дана таблица с четырьмя типами join-ов: JOIN, LEFT JOIN, RIGHT JOIN, OUTER JOIN (FULL OUTER JOIN). После таблицы следует картинка, где показан: INNER JOIN, LEFT JOIN, RIGHT JOIN и CROSS JOIN??? Вводит заблужение, ведь OUTER JOIN и CROSS JOIN - это совершенно разные вещи!!!
Дмитрий/MrJonson Уровень 93
2 августа 2025
Тут еще круче, написал запрос предпоследнее задание, пишет не правильно, проверяю все правильно еще раз нажимаю, Теперь правильно. Интересно.....
Aliransa Уровень 109
28 января 2025
жутчайше бесит, что из задачи в задачу необходимо по-разному переименовывать название одних и тех же таблиц. тупо кучу времени уходит проверить везде ли использовал правильное переименование
Ivan Уровень 2
15 июня 2025
Я уже дошёл до того, что делаю первую и последнюю задачу в главе. А остальные отдаю на откуп ИИ. Всё равно они одинаковые.
Yuri S Уровень 50
21 июля 2025
открою для вас секрет! не нужно отдавать на откуп ИИ, в задаче всегда можно посмотреть на правильное решение.
Ivan Уровень 2
23 июля 2025
Открою другой секрет. Если в ДипСике нажать кнопку DeepThink, то нейросеть по шагам рассказывает, как она решала задачу. Не хочешь, а запоминаешь. В правильном решении такой фигни нет.
Олег Уровень 106 Expert
19 сентября 2024
Устал
Алексей Уровень 72 Expert
24 июля 2024
ну задачи, да, такое... и еще, где то в уголке тихо плачет оператор OUTER JOIN которым назвали лекцию, но так нигде в задачах и не использовали.
Имран Уровень 45
19 августа 2024
Задачи из джавараша удалили или как? Нигде их не нахожу
Aliransa Уровень 109
26 января 2025
задачи есть только с подпиской с ментором или со стажировкой
Anonymous #2523066 Уровень 10
4 февраля 2025
Есть много онлайн sql тренажеров в интернете, где можно потренироваться
Евгений Уровень 22
29 ноября 2023
Есть еще semi-join и anti-semi-join.
Ivan Уровень 2
15 июня 2025
Семитский и антисемитский джойн?
Данила Уровень 111 Expert
17 ноября 2023
В целом задачи хорошие, их много и они не супер сложные, а даже немного простоваты, реально набиваешь руку и откладывается всё, начало хорошее Но не совсем понял некоторые. "Дано вот это, сделай это", точнее скопируй это и вставь сюда. Много подсказок слишком, и задачи решаются просто подстановкой из условия "При помощи того-то, используя это добавить то-то из того-то " Ну много как-то. Просто достаточно " Должно быть больше 5" Я бы немного изменил условие, убрал "туториалы", в комментариях уже тоже сказали про это. А также разбил на абзацы условие, тяжело очень читать сплошной текст. Также убрал бы условие по переименовыванию, на уровне где мы только с ним познакомились это хорошо, но например тут и в будущем мне удобнее написать a вместо auth
Павел Уровень 111 Expert
7 ноября 2023
Задачи на синтаксис, не на логику и понимание. В условии пошагово расписаны все шаги для решения, какие данные из таблиц и какие операторы использовать. Вместо этого хотелось бы например "выбери из таблицы А все произведения авторов мужского пола из таблицы Б написанные в период с такого-то по такой-то год, сгруппируй их по имени автора и упорядочи по году написания в обратном хронологическом порядке. В результате отобрази только такие-то столбцы". Ну и написание условия - глаза ломаются. Всё переношу в Notepad и отбиваю каждый пункт условия с новой строки.
Yauheni K Уровень 1
18 октября 2023
Все строки баз пар