Загрузка данных


CREATE DATABASE IF NOT EXISTS practice3;
USE practice3;

-- Таблица пользователей
CREATE TABLE users (
    id         INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(50)  NOT NULL,
    last_name  VARCHAR(50)  NOT NULL,
    email      VARCHAR(100) UNIQUE NOT NULL,
    role       ENUM('student', 'teacher') DEFAULT 'student'
);

-- Таблица курсов (добавлен teacher_id для связи с преподавателем)
CREATE TABLE courses (
    id          INT PRIMARY KEY AUTO_INCREMENT,
    title       VARCHAR(100) NOT NULL,
    description TEXT,
    duration    INT          NOT NULL,
    category    VARCHAR(100) NOT NULL,
    teacher_id  INT,
    FOREIGN KEY (teacher_id) REFERENCES users(id)
);

-- Таблица уроков
CREATE TABLE lessons (
    id               INT PRIMARY KEY AUTO_INCREMENT,
    topic            VARCHAR(100) NOT NULL,
    course_id        INT          NOT NULL,
    duration_minutes INT          NOT NULL,
    FOREIGN KEY (course_id) REFERENCES courses(id)
);

-- Таблица записей на курс
CREATE TABLE enrollments (
    id          INT PRIMARY KEY AUTO_INCREMENT,
    user_id     INT  NOT NULL,
    course_id   INT  NOT NULL,
    start_date  DATE NOT NULL,
    status      ENUM('active', 'inactive') DEFAULT 'active',
    FOREIGN KEY (user_id)   REFERENCES users(id),
    FOREIGN KEY (course_id) REFERENCES courses(id)
);

-- Таблица отзывов
CREATE TABLE reviews (
    id        INT PRIMARY KEY AUTO_INCREMENT,
    user_id   INT     NOT NULL,
    course_id INT     NOT NULL,
    rating    TINYINT NOT NULL CHECK (rating BETWEEN 1 AND 5),
    comment   TEXT,
    FOREIGN KEY (user_id)   REFERENCES users(id),
    FOREIGN KEY (course_id) REFERENCES courses(id)
);


-- Пользователи (преподаватели и студенты)
INSERT INTO users (first_name, last_name, email, role) VALUES
('Сергей',    'Иванов',   'ivanov@mail.ru',    'teacher'),
('Анна',      'Смирнова', 'smirnova@mail.ru',  'teacher'),
('Алексей',   'Петров',   'petrov@mail.ru',    'student'),
('Мария',     'Кузнецова','kuznecova@mail.ru', 'student'),
('Дмитрий',   'Новиков',  'novikov@mail.ru',   'student'),
('Ольга',     'Морозова', 'morozova@mail.ru',  'student'),
('Иван',      'Козлов',   'kozlov@mail.ru',    'student'),
('Светлана',  'Лебедева', 'lebedeva@mail.ru',  'student'),
('Андрей',    'Попов',    'popov@mail.ru',     'student'),
('Екатерина', 'Васильева','vasileva@mail.ru',  'student');

-- Курсы (teacher_id=1 — Иванов Сергей, teacher_id=2 — Смирнова Анна)
INSERT INTO courses (title, description, duration, category, teacher_id) VALUES
('Программирование на Python', 'Основы Python',          40, 'информатика', 1),
('Базы данных',                'SQL и проектирование БД', 30, 'информатика', 1),
('Математика для начинающих',  'Базовая математика',      20, 'математика',  2),
('Алгебра и анализ',           'Высшая математика',       35, 'математика',  2),
('Веб-разработка',             'HTML, CSS, JavaScript',  50, 'информатика', 1),
('Статистика',                 'Основы статистики',       25, 'математика',  2);

-- Записи на курсы (студенты id: 3–10)
INSERT INTO enrollments (user_id, course_id, start_date, status) VALUES
(3,  1, '2024-09-01', 'active'),
(4,  1, '2024-09-01', 'active'),
(5,  1, '2024-09-01', 'inactive'),
(6,  1, '2024-09-01', 'active'),
(7,  2, '2024-09-05', 'active'),
(8,  2, '2024-09-05', 'active'),
(9,  3, '2024-09-10', 'active'),
(10, 3, '2024-09-10', 'active'),
(3,  3, '2024-09-10', 'inactive'),
(4,  5, '2024-09-15', 'active'),
(5,  5, '2024-09-15', 'active'),
(6,  4, '2024-09-20', 'active');

-- Отзывы
INSERT INTO reviews (user_id, course_id, rating, comment) VALUES
(3,  1, 5, 'Отличный курс!'),
(4,  1, 4, 'Очень полезно'),
(9,  3, 5, 'Всё понятно объясняется'),
(10, 3, 3, 'Неплохо, но хотелось бы больше практики'),
(3,  3, 4, 'Хороший курс');

SELECT first_name, last_name, email
FROM users
WHERE role = 'teacher'
ORDER BY first_name ASC, last_name ASC;

SELECT title, description, duration
FROM courses
WHERE category = 'информатика'
ORDER BY title ASC;

SELECT u.first_name, u.last_name, u.email, e.start_date, e.status
FROM users u
JOIN enrollments e ON u.id = e.user_id
JOIN courses c     ON e.course_id = c.id
WHERE c.title = 'Программирование на Python'
  AND u.role  = 'student';

SELECT c.title,
       COUNT(e.user_id) AS active_students
FROM courses c
JOIN enrollments e ON c.id = e.course_id
WHERE e.status = 'active'
GROUP BY c.id, c.title
ORDER BY active_students DESC;


SELECT c.title, c.category, c.duration
FROM courses c
JOIN users u ON c.teacher_id = u.id
WHERE u.last_name  = 'Иванов'
  AND u.first_name = 'Сергей'
  AND u.role       = 'teacher';


SELECT u.first_name, u.last_name, r.rating, r.comment
FROM users u
JOIN reviews r ON u.id = r.user_id
JOIN courses c ON r.course_id = c.id
WHERE c.title = 'Математика для начинающих';