Практична робота №17. Складні багатотабличні запити (JOIN + підзапити)
Мета
Закріпити навички побудови складних багатотабличних запитів, що поєднують з'єднання, підзапити, агрегацію та операції над множинами.
Підготовка
Перед виконанням опрацюйте пов'язані лекції:
Завдання
Виконайте наскрізний набір запитів для схеми college із повним набором таблиць (departments, courses, students, enrollments, teachers).
- Звіт «Підрозділ → кількість курсів → кількість реєстрацій» з двома JOIN та агрегацією:
SELECT d.name AS department,
COUNT(DISTINCT c.course_id) AS courses,
COUNT(e.student_id) AS enrollments
FROM college.departments AS d
LEFT JOIN college.courses AS c USING (department_id)
LEFT JOIN college.enrollments AS e USING (course_id)
GROUP BY d.name
ORDER BY enrollments DESC;
- «Середній бал студента» з JOIN, агрегацією та фільтрацією
HAVING(лише студенти з щонайменше однією оцінкою). - «Курси, які жодного разу не обрали» — через
LEFT JOINі перевіркуNULL; потім той самий результат черезNOT EXISTS. - «Викладачі, які ведуть найбільше курсів» — з підзапитом у
FROMабоHAVING. - Комбінований звіт: студенти, що мають оцінку вищу за середню по курсу, — з корельованим підзапитом.
- Операція над множинами: перелічіть коди курсів, які є і в першого, і в другого підрозділу, через
INTERSECT.
Вимоги до результату
- SQL-скрипт
advanced.sqlіз запитами в порядку виконання. - Для кожного запиту: мета, SQL, результат, пояснення.
- Порівняння
LEFT JOIN + NULLіNOT EXISTSдля одного завдання. - Підсумковий висновок про типові підходи до складних звітів.
Питання для захисту
- Як вирішити, що використати: JOIN чи підзапит?
- Чому
COUNT(DISTINCT ...)потрібен після множення рядків через JOIN? - Як перевірити коректність складного запиту?
- Що змінить
LEFT JOINнаINNER JOINу першому запиті?
