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


-- =====================================================
-- 1. СОЗДАНИЕ ТАБЛИЦ (SQLite / стандартный SQL)
-- =====================================================

CREATE TABLE departments (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL UNIQUE
);

CREATE TABLE subjects (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    department_id INTEGER NOT NULL,
    FOREIGN KEY (department_id) REFERENCES departments(id) ON DELETE RESTRICT
);

CREATE TABLE teachers (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    full_name TEXT NOT NULL,
    department_id INTEGER NOT NULL,
    FOREIGN KEY (department_id) REFERENCES departments(id) ON DELETE RESTRICT
);

CREATE TABLE students (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    full_name TEXT NOT NULL,
    group_name TEXT NOT NULL,
    department_id INTEGER NOT NULL,
    FOREIGN KEY (department_id) REFERENCES departments(id) ON DELETE RESTRICT
);

CREATE TABLE grade_reports (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    student_id INTEGER NOT NULL,
    subject_id INTEGER NOT NULL,
    teacher_id INTEGER NOT NULL,
    grade INTEGER NOT NULL CHECK (grade BETWEEN 2 AND 5),
    exam_date TEXT NOT NULL DEFAULT CURRENT_DATE,
    FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE,
    FOREIGN KEY (subject_id) REFERENCES subjects(id) ON DELETE CASCADE,
    FOREIGN KEY (teacher_id) REFERENCES teachers(id)
);

-- =====================================================
-- 2. ТЕСТОВЫЕ ДАННЫЕ
-- =====================================================

INSERT INTO departments (name) VALUES 
    ('Кафедра информационных систем'),
    ('Кафедра сетей и телекоммуникаций');

INSERT INTO subjects (name, department_id) VALUES 
    ('Базы данных', 1),
    ('Программирование', 1),
    ('Сетевые технологии', 2);

INSERT INTO teachers (full_name, department_id) VALUES 
    ('Ефимова А.А.', 1),
    ('Иванов И.И.', 1),
    ('Петров П.П.', 2);

INSERT INTO students (full_name, group_name, department_id) VALUES 
    ('Сидоров С.С.', 'ИС-21', 1),
    ('Кузнецова К.К.', 'ИС-21', 1),
    ('Смирнов С.С.', 'СТ-31', 2),
    ('Васильева В.В.', 'СТ-31', 2);

INSERT INTO grade_reports (student_id, subject_id, teacher_id, grade, exam_date) VALUES 
    (1, 1, 1, 5, '2025-01-10'),
    (1, 2, 2, 4, '2025-01-15'),
    (2, 1, 1, 3, '2025-01-10'),
    (2, 2, 2, 5, '2025-01-15'),
    (3, 3, 3, 4, '2025-01-20'),
    (4, 3, 3, 5, '2025-01-20'),
    (1, 1, 1, 5, '2025-06-05');

-- =====================================================
-- 3. ЗАПРОСЫ ПО ЗАДАНИЮ
-- =====================================================

-- 3.1 Простой запрос с условием
-- Студенты, сдавшие 'Базы данных' на 5
SELECT s.full_name, g.grade
FROM students s
JOIN grade_reports g ON s.id = g.student_id
JOIN subjects sub ON g.subject_id = sub.id
WHERE sub.name = 'Базы данных' AND g.grade = 5;

-- 3.2 Запрос с соединением таблиц (JOIN)
-- Студент, дисциплина, оценка, преподаватель
SELECT 
    st.full_name AS student,
    sub.name AS subject,
    gr.grade,
    t.full_name AS teacher
FROM grade_reports gr
JOIN students st ON gr.student_id = st.id
JOIN subjects sub ON gr.subject_id = sub.id
JOIN teachers t ON gr.teacher_id = t.id
ORDER BY st.full_name;

-- 3.3 Группировка + агрегатная функция
-- Средний балл по каждой дисциплине
SELECT 
    sub.name AS subject,
    ROUND(AVG(gr.grade), 2) AS avg_grade
FROM grade_reports gr
JOIN subjects sub ON gr.subject_id = sub.id
GROUP BY sub.id, sub.name;

-- 3.4 Подзапрос
-- Студенты со средним баллом выше общего среднего
SELECT 
    s.full_name,
    (SELECT ROUND(AVG(grade), 2) 
     FROM grade_reports 
     WHERE student_id = s.id) AS student_avg
FROM students s
WHERE (SELECT AVG(grade) FROM grade_reports WHERE student_id = s.id) > (
    SELECT AVG(grade) FROM grade_reports
);

-- 3.5 Обновление данных
-- У Сидорова по Программированию оценку 4 → 5
UPDATE grade_reports
SET grade = 5
WHERE student_id = (SELECT id FROM students WHERE full_name = 'Сидоров С.С.')
  AND subject_id = (SELECT id FROM subjects WHERE name = 'Программирование');

-- Проверка обновления
SELECT 
    s.full_name,
    sub.name,
    gr.grade
FROM grade_reports gr
JOIN students s ON gr.student_id = s.id
JOIN subjects sub ON gr.subject_id = sub.id
WHERE s.full_name = 'Сидоров С.С.' AND sub.name = 'Программирование';