Оператор OUTER JOIN

Открыта

Причины появления 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 лекция
Недоступна
Где больше романистов
Где больше романистов
Комментарии (28)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
КириллQA Engineer в Sogaz-OMS
27 мая, 22:13
берём самые навороченные задачи с точки зрения условия, решаем получилось самостоятельно решить? значит остальные тупо скипайте, ибо время чисто на прочтение условия потратите больше, чем на решение
Виктор
Уровень 109
4 сентября 2025, 22:59
В разделе: Типы 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, 16:30
Тут еще круче, написал запрос предпоследнее задание, пишет не правильно, проверяю все правильно еще раз нажимаю, Теперь правильно. Интересно.....
Aliransa
Уровень 109
28 января 2025, 08:16
жутчайше бесит, что из задачи в задачу необходимо по-разному переименовывать название одних и тех же таблиц. тупо кучу времени уходит проверить везде ли использовал правильное переименование
Ivan
Уровень 93
15 июня 2025, 16:15
Я уже дошёл до того, что делаю первую и последнюю задачу в главе. А остальные отдаю на откуп ИИ. Всё равно они одинаковые.
Yuri SFrontend Developer в PRG
21 июля 2025, 05:37
открою для вас секрет! не нужно отдавать на откуп ИИ, в задаче всегда можно посмотреть на правильное решение.
Ivan
Уровень 93
23 июля 2025, 16:02
Открою другой секрет. Если в ДипСике нажать кнопку DeepThink, то нейросеть по шагам рассказывает, как она решала задачу. Не хочешь, а запоминаешь. В правильном решении такой фигни нет.
Олег
Уровень 106
Expert
19 сентября 2024, 19:15
Устал
Алексей
Уровень 72
Expert
24 июля 2024, 19:38
ну задачи, да, такое... и еще, где то в уголке тихо плачет оператор OUTER JOIN которым назвали лекцию, но так нигде в задачах и не использовали.
Имран
Уровень 45
19 августа 2024, 09:54
Задачи из джавараша удалили или как? Нигде их не нахожу
Aliransa
Уровень 109
26 января 2025, 08:18
задачи есть только с подпиской с ментором или со стажировкой
Anonymous #2523066
Уровень 10
4 февраля 2025, 06:19
Есть много онлайн sql тренажеров в интернете, где можно потренироваться
Евгений
Уровень 22
29 ноября 2023, 23:25
Есть еще semi-join и anti-semi-join.
Ivan
Уровень 93
15 июня 2025, 15:59
Семитский и антисемитский джойн?
Данила
Уровень 111
Expert
17 ноября 2023, 08:48
В целом задачи хорошие, их много и они не супер сложные, а даже немного простоваты, реально набиваешь руку и откладывается всё, начало хорошее Но не совсем понял некоторые. "Дано вот это, сделай это", точнее скопируй это и вставь сюда. Много подсказок слишком, и задачи решаются просто подстановкой из условия "При помощи того-то, используя это добавить то-то из того-то " Ну много как-то. Просто достаточно " Должно быть больше 5" Я бы немного изменил условие, убрал "туториалы", в комментариях уже тоже сказали про это. А также разбил на абзацы условие, тяжело очень читать сплошной текст. Также убрал бы условие по переименовыванию, на уровне где мы только с ним познакомились это хорошо, но например тут и в будущем мне удобнее написать a вместо auth
Павел
Уровень 111
Expert
7 ноября 2023, 14:39
Задачи на синтаксис, не на логику и понимание. В условии пошагово расписаны все шаги для решения, какие данные из таблиц и какие операторы использовать. Вместо этого хотелось бы например "выбери из таблицы А все произведения авторов мужского пола из таблицы Б написанные в период с такого-то по такой-то год, сгруппируй их по имени автора и упорядочи по году написания в обратном хронологическом порядке. В результате отобрази только такие-то столбцы". Ну и написание условия - глаза ломаются. Всё переношу в Notepad и отбиваю каждый пункт условия с новой строки.
Yauheni KFull Stack React Java Dev в Google
18 октября 2023, 05:20
Все строки баз пар