Занятие 27. Практикум 7
⚡ Кратко: суть темы
Практикум — три задачи, каждая решается несколькими способами. Сравниваем LEFT JOIN, подзапросы и CTE; учимся выбирать читаемый вариант.
LEFT JOIN ... IS NULLищет отсутствие связи.NOT INиNOT EXISTS— альтернативы через подзапросы.WITHпомогает разбить сложную задачу на шаги.
📖 Что повторим
Перед практикумом стоит освежить три темы:
Подзапросы
Подзапрос — это SELECT, вложенный внутрь другого запроса. Может возвращать одно значение, список значений или таблицу.
SELECT *
FROM orders
WHERE employee_id IN (
SELECT id FROM employees WHERE job_title = 'Sales Representative'
);
CTE
CTE позволяет дать имя временному результату SELECT и использовать его в основном запросе.
WITH sales_repr AS (
SELECT id FROM employees WHERE job_title = 'Sales Representative'
)
SELECT *
FROM orders
WHERE employee_id IN (SELECT id FROM sales_repr);
LEFT JOIN для поиска отсутствующих строк
Чтобы найти строки, которые не имеют связи в другой таблице, используют LEFT JOIN и фильтр WHERE связанная_таблица.id IS NULL.
SELECT e.first_name, e.last_name
FROM employees AS e
LEFT JOIN employee_privileges AS ep ON e.id = ep.employee_id
WHERE ep.employee_id IS NULL;
Проверить по документации: точные названия столбцов в
employee_privileges могут отличаться. Уточните схему базы northwind перед выполнением.