Оператор 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 лекция
Недоступна
task0323
В этой задаче тебе потребуется: 1. Выбрать колонку last_name из таблицы customers, временно изменив название на surname (используй AS) и колонку order_id из таблицы orders. 2. Объединить таблицы customers и orders оператором LEFT JOIN. 3. Используя оператор ON, добавить условие, что колонка customer
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
task0324
В этой задаче тебе потребуется: 1. Выбрать колонку customer_id из таблицы customers и колонку order_id из таблицы orders. 2. Объединить таблицы customers и orders оператором LEFT JOIN, заменив их имена на c и o, соответственно, используя оператор AS. 3. Используя оператор ON, добавить условие, что к
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
task0325
В этой задаче тебе потребуется: 1. Выбрать колонку zip_code из таблицы customers и колонку order_id из таблицы orders. 2. Объединить таблицы customers и orders оператором LEFT JOIN, заменив их имена на c и o, соответственно, используя оператор AS. 3. Используя оператор ON, добавить условие, что коло
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
task0326
В этой задаче тебе потребуется: 1. Выбрать колонку email из таблицы customers и все колонки из таблицы orders. 2. Объединить таблицы customers и orders оператором RIGHT JOIN. 3. Используя оператор ON, добавить условие, что колонка customer_id таблицы customers равнa колонке customer_id таблицы order
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
task0327
В этой задаче тебе потребуется: 1. Выбрать колонку city из таблицы customers и колонку store_id из таблицы orders. 2. Объединить таблицы customers и orders оператором RIGHT JOIN. 3. Используя оператор ON, добавить условие, что колонка customer_id таблицы customers равнa колонке customer_id таблицы o
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
task0328
В этой задаче тебе потребуется: 1. Выбрать колонку phone из таблицы customers и переименовать её в cust_phone (используй оператор AS). Также выбрать колонки order_date, total_cost и store_id из таблицы orders. 2. Объединить таблицы customers и orders оператором RIGHT JOIN. 3. Используя оператор ON,
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
task0329
В этой задаче тебе потребуется: 1. Выбрать колонку customer_id из таблицы customers и колонку order_status из таблицы orders. 2. Объединить таблицы customers и orders оператором JOIN, при этом изменив их названия на c и o, соответственно (используя оператор AS). 3. Используя оператор ON, добавить ус
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
task0330
В этой задаче тебе потребуется: 1. Выбрать колонку zip_code из таблицы customers, переименовав её в cust_zip_code, и колонку order_status из таблицы orders, переименовав её в status. 2. Объединить таблицы customers и orders оператором LEFT JOIN. 3. Используя оператор ON, добавить условие, что колонк
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
task0331
В этой задаче тебе потребуется: 1. Выбрать колонку last_name из таблицы authors, переименовав её в author, и колонки title и copies_sold_millions из таблицы books, переименовав их в book_title и books_sold, соответственно. 2. Объединить таблицы authors и books оператором RIGHT JOIN, переименовав их
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
task0332
В этой задаче тебе потребуется: 1. Выбрать колонку last_name из таблицы authors, переименовав её в author, и колонки genre и date_released из таблицы books, переименовав genre в book_genre. 2. Объединить таблицы authors и books оператором RIGHT JOIN, переименовав их в аuth и book, соответственно. 3.
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
task0333
В этой задаче тебе потребуется: 1. Выбрать колонки sex и country из таблицы authors, переименовав их в author_sex и author_country, соответственно. Также, выбрать колонку copies_sold_millions из таблицы books, переименовав её в books_sold. 2. Объединить таблицы authors и books оператором JOIN, переи
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
task0334
1. Выбрать колонки last_name и country из таблицы authors, переименовав их в author и author_country, соответственно. Также, выбрать колонку genre из таблицы books, переименовав её в book_genre. 2. Объединить таблицы authors и books оператором LEFT JOIN, переименовав их в author и book, соответствен
1
Задача
Модуль 4. Работа с БД, 3 уровень, 3 лекция
Недоступна
task0335
1. Выбрать колонку country из таблицы authors, переименовав её в author_country. 2. Передать в оператор COUNT колонку book_id таблицы books, переименовав её в book_count. 2. Объединить таблицы authors и books оператором JOIN, переименовав их в author и book, соответственно. 3. Используя оператор ON,
Комментарии (28)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Виктор Уровень 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 Уровень 59
15 июня 2025
Я уже дошёл до того, что делаю первую и последнюю задачу в главе. А остальные отдаю на откуп ИИ. Всё равно они одинаковые.
Yuri S Уровень 50
21 июля 2025
открою для вас секрет! не нужно отдавать на откуп ИИ, в задаче всегда можно посмотреть на правильное решение.
Ivan Уровень 59
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 Уровень 59
15 июня 2025
Семитский и антисемитский джойн?
Данила Уровень 111 Expert
17 ноября 2023
В целом задачи хорошие, их много и они не супер сложные, а даже немного простоваты, реально набиваешь руку и откладывается всё, начало хорошее Но не совсем понял некоторые. "Дано вот это, сделай это", точнее скопируй это и вставь сюда. Много подсказок слишком, и задачи решаются просто подстановкой из условия "При помощи того-то, используя это добавить то-то из того-то " Ну много как-то. Просто достаточно " Должно быть больше 5" Я бы немного изменил условие, убрал "туториалы", в комментариях уже тоже сказали про это. А также разбил на абзацы условие, тяжело очень читать сплошной текст. Также убрал бы условие по переименовыванию, на уровне где мы только с ним познакомились это хорошо, но например тут и в будущем мне удобнее написать a вместо auth
Павел Уровень 111 Expert
7 ноября 2023
Задачи на синтаксис, не на логику и понимание. В условии пошагово расписаны все шаги для решения, какие данные из таблиц и какие операторы использовать. Вместо этого хотелось бы например "выбери из таблицы А все произведения авторов мужского пола из таблицы Б написанные в период с такого-то по такой-то год, сгруппируй их по имени автора и упорядочи по году написания в обратном хронологическом порядке. В результате отобрази только такие-то столбцы". Ну и написание условия - глаза ломаются. Всё переношу в Notepad и отбиваю каждый пункт условия с новой строки.
Yauheni K Уровень 1
18 октября 2023
Все строки баз пар
Anonymous #3129578 Уровень 108
25 мая 2023

SELECT author.last_name AS author
FROM authors AS author
В приличном обществе за такое бьют, возможно даже ногами