← К оглавлению занятия

Занятие 27. Практикум 7

📁 Блок: SQL / MySQL / Подзапросы и CTE ⏱️ Время изучения: ~90 мин 🎯 Сложность: Практикум
#join #where #null #in #select #as #create

⚡ Кратко: суть темы

Практикум — три задачи, каждая решается несколькими способами. Сравниваем 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 перед выполнением.