Занятие 23. Практикум 6
⚡ Кратко: повтор перед практикой
UNION ALLсклеивает строки;UNIONещё и удаляет дубликаты.LEFT JOIN ... IS NULLнаходит записи без связи.- Многотабличные JOIN читаются слева направо.
📖 Теория, необходимая для практикума
1. UNION и UNION ALL
Оба оператора объединяют результаты нескольких SELECT. Важные правила:
- Количество столбцов в каждом
SELECTдолжно совпадать. - Типы данных в соответствующих столбцах должны быть совместимы.
UNIONудаляет дубликаты;UNION ALL— нет, но работает быстрее.
SELECT company FROM employees
UNION ALL
SELECT company FROM customers
UNION ALL
SELECT company FROM suppliers;
2. INNER JOIN vs LEFT JOIN
INNER JOIN— только пары строк с совпадающими ключами.LEFT JOIN— все строки левой таблицы; для несовпадений справа возвращаетсяNULL.
3. Поиск записей без связи
Классический приём: LEFT JOIN + проверка 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;
Этот паттерн часто называют anti-join: находим строки, для которых нет связанных записей.
4. Соединение трёх и более таблиц
Каждый следующий JOIN применяется к результату предыдущего:
SELECT it.transaction_created_date, itt.type_name, p.product_name
FROM inventory_transactions AS it
JOIN inventory_transaction_types AS itt
ON it.transaction_type = itt.id
JOIN products AS p
ON it.product_id = p.id;
5. Фильтрация групп
Если нужно отфильтровать строки до группировки — используем WHERE. Если условие на агрегат — используем HAVING.
SELECT type_name, COUNT(*) AS transaction_count
FROM inventory_transactions AS it
JOIN inventory_transaction_types AS itt
ON it.transaction_type = itt.id
WHERE itt.type_name NOT LIKE '%Sold%'
GROUP BY itt.type_name;