Загрузка данных
-- =====================================================
-- КУРСЫ ПОВЫШЕНИЯ КВАЛИФИКАЦИИ (CoursesDB)
-- Полный скрипт: DDL + DML + все 5 заданий
-- =====================================================
-- 1. УДАЛЕНИЕ ТАБЛИЦ (если существуют)
DROP TABLE IF EXISTS enrollments;
DROP TABLE IF EXISTS students;
DROP TABLE IF EXISTS courses;
DROP TABLE IF EXISTS instructors;
-- 2. СОЗДАНИЕ СТРУКТУРЫ (DDL)
CREATE TABLE instructors (
id SERIAL PRIMARY KEY,
full_name VARCHAR(100) NOT NULL,
rating NUMERIC(3,2) CHECK (rating BETWEEN 0 AND 5)
);
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
title VARCHAR(200) NOT NULL,
instructor_id INT NOT NULL REFERENCES instructors(id) ON DELETE CASCADE,
price DECIMAL(10,2) NOT NULL CHECK (price >= 0),
duration_hours INT NOT NULL CHECK (duration_hours > 0)
);
CREATE TABLE students (
id SERIAL PRIMARY KEY,
full_name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL
);
CREATE TABLE enrollments (
id SERIAL PRIMARY KEY,
student_id INT NOT NULL REFERENCES students(id) ON DELETE CASCADE,
course_id INT NOT NULL REFERENCES courses(id) ON DELETE CASCADE,
enroll_date DATE NOT NULL DEFAULT CURRENT_DATE,
final_grade INT CHECK (final_grade BETWEEN 1 AND 100)
);
-- 3. НАПОЛНЕНИЕ ТЕСТОВЫМИ ДАННЫМИ (DML)
-- Инструкторы
INSERT INTO instructors (full_name, rating) VALUES
('Анна Иванова', 4.8),
('Борис Петров', 4.2),
('Виктор Смирнов', 4.9);
-- Курсы
INSERT INTO courses (title, instructor_id, price, duration_hours) VALUES
('Основы SQL', 1, 5000.00, 20),
('Продвинутый Python', 2, 12000.00, 40),
('Анализ данных в Excel', 1, 3500.00, 15),
('Машинное обучение', 3, 25000.00, 60);
-- Студенты
INSERT INTO students (full_name, email) VALUES
('Иван Иванов', 'ivan@example.com'),
('Мария Петрова', 'maria@example.com'),
('Сергей Сидоров', 'sergey@example.com'),
('Елена Смирнова', 'elena@example.com'),
('Дмитрий Козлов', 'dmitry@example.com');
-- Записи на курсы
INSERT INTO enrollments (student_id, course_id, enroll_date, final_grade) VALUES
(1, 1, '2024-01-15', 85),
(1, 2, '2024-03-10', NULL),
(2, 1, '2024-01-20', 92),
(2, 3, '2024-02-01', 78),
(3, 2, '2024-04-01', NULL),
(4, 4, '2024-02-15', NULL),
(5, 1, '2024-01-25', 65);
-- =====================================================
-- ВЫПОЛНЕНИЕ ЗАДАНИЙ
-- =====================================================
-- ЗАДАНИЕ 1 (CRUD): Добавить новый курс и записать на него двух студентов
-- Добавляем курс
INSERT INTO courses (title, instructor_id, price, duration_hours)
VALUES ('Введение в Data Science', 3, 15000.00, 30);
-- Записываем двух студентов на новый курс
INSERT INTO enrollments (student_id, course_id, enroll_date)
SELECT s.id, c.id, CURRENT_DATE
FROM students s
CROSS JOIN courses c
WHERE s.email IN ('ivan@example.com', 'elena@example.com')
AND c.title = 'Введение в Data Science';
-- Проверка результата задания 1
SELECT 'Задание 1: Новый курс и записи' AS task;
SELECT * FROM courses WHERE title = 'Введение в Data Science';
SELECT s.full_name, c.title, e.enroll_date
FROM enrollments e
JOIN students s ON e.student_id = s.id
JOIN courses c ON e.course_id = c.id
WHERE c.title = 'Введение в Data Science';
-- =====================================================
-- ЗАДАНИЕ 2 (JOIN): Список студентов и названия курсов, на которые они записаны
SELECT 'Задание 2: Студенты и их курсы' AS task;
SELECT
s.full_name AS student_name,
c.title AS course_title,
e.enroll_date
FROM enrollments e
JOIN students s ON e.student_id = s.id
JOIN courses c ON e.course_id = c.id
ORDER BY s.full_name, e.enroll_date;
-- =====================================================
-- ЗАДАНИЕ 3 (Агрегация): Средняя оценка по каждому курсу (только завершённые)
SELECT 'Задание 3: Средняя оценка по курсам' AS task;
SELECT
c.title AS course_title,
ROUND(AVG(e.final_grade), 2) AS average_grade,
COUNT(e.id) AS completed_students
FROM enrollments e
JOIN courses c ON e.course_id = c.id
WHERE e.final_grade IS NOT NULL
GROUP BY c.id, c.title
ORDER BY average_grade DESC;
-- =====================================================
-- ЗАДАНИЕ 4 (Фильтрация с подзапросом): Курсы дороже среднего
SELECT 'Задание 4: Курсы дороже среднего' AS task;
SELECT
title,
price,
duration_hours
FROM courses
WHERE price > (SELECT AVG(price) FROM courses)
ORDER BY price DESC;
-- =====================================================
-- ЗАДАНИЕ 5 (Сортировка): Инструкторы по убыванию рейтинга
SELECT 'Задание 5: Инструкторы по рейтингу' AS task;
SELECT
full_name,
rating
FROM instructors
ORDER BY rating DESC;
-- =====================================================
-- КОНЕЦ СКРИПТА
-- =====================================================