-- =============================================
-- ЛАБОРАТОРНАЯ РАБОТА №4: СОЗДАНИЕ БАЗЫ ДАННЫХ "УНИВЕРСИТЕТ"
-- =============================================
-- УДАЛЕНИЕ СУЩЕСТВУЮЩИХ ТАБЛИЦ (ЕСЛИ ОНИ ЕСТЬ)
-- Удаляем в правильном порядке из-за внешних ключей
DROP TABLE IF EXISTS EXAM_MARKS;
DROP TABLE IF EXISTS SUBJ_LECT;
DROP TABLE IF EXISTS SUBJECT;
DROP TABLE IF EXISTS LECTURER;
DROP TABLE IF EXISTS STUDENT;
DROP TABLE IF EXISTS UNIVERSITY;
-- =============================================
-- СОЗДАНИЕ ТАБЛИЦ
-- =============================================
-- ТАБЛИЦА 1: УНИВЕРСИТЕТЫ
CREATE TABLE UNIVERSITY (
UNIV_ID INTEGER PRIMARY KEY, -- Уникальный идентификатор университета
UNIV_NAME VARCHAR(100) NOT NULL, -- Название университета (обязательное поле)
RATING INTEGER, -- Рейтинг университета
CITY VARCHAR(50) -- Город расположения
);
-- ТАБЛИЦА 2: СТУДЕНТЫ
CREATE TABLE STUDENT (
STUDENT_ID INTEGER PRIMARY KEY, -- Уникальный идентификатор студента
SURNAME VARCHAR(50) NOT NULL, -- Фамилия студента (обязательное поле)
NAME VARCHAR(50) NOT NULL, -- Имя студента (обязательное поле)
STIPEND DECIMAL(10,2), -- Размер стипендии (10 цифр, 2 после запятой)
KURS INTEGER NOT NULL, -- Курс обучения (обязательное поле)
CITY VARCHAR(50), -- Город проживания
BIRTHDAY DATE, -- Дата рождения
UNIV_ID INTEGER, -- Идентификатор университета (внешний ключ)
FOREIGN KEY (UNIV_ID) REFERENCES UNIVERSITY(UNIV_ID) -- Связь с таблицей UNIVERSITY
);
-- ТАБЛИЦА 3: ПРЕПОДАВАТЕЛИ
CREATE TABLE LECTURER (
LECTURER_ID INTEGER PRIMARY KEY, -- Уникальный идентификатор преподавателя
SURNAME VARCHAR(50) NOT NULL, -- Фамилия преподавателя (обязательное поле)
NAME VARCHAR(50) NOT NULL, -- Имя преподавателя (обязательное поле)
CITY VARCHAR(50), -- Город проживания
UNIV_ID INTEGER, -- Идентификатор университета (внешний ключ)
FOREIGN KEY (UNIV_ID) REFERENCES UNIVERSITY(UNIV_ID) -- Связь с таблицей UNIVERSITY
);
-- ТАБЛИЦА 4: УЧЕБНЫЕ ДИСЦИПЛИНЫ
CREATE TABLE SUBJECT (
SUBJ_ID INTEGER PRIMARY KEY, -- Уникальный идентификатор дисциплины
SUBJ_NAME VARCHAR(100) NOT NULL, -- Название дисциплины (обязательное поле)
HOUR INTEGER, -- Количество часов
SEMESTER INTEGER -- Семестр преподавания
);
-- ТАБЛИЦА 5: СВЯЗЬ ПРЕПОДАВАТЕЛЕЙ И ДИСЦИПЛИН
CREATE TABLE SUBJ_LECT (
LECTURER_ID INTEGER, -- Идентификатор преподавателя (часть ключа)
SUBJ_ID INTEGER, -- Идентификатор дисциплины (часть ключа)
PRIMARY KEY (LECTURER_ID, SUBJ_ID), -- Составной первичный ключ
FOREIGN KEY (LECTURER_ID) REFERENCES LECTURER(LECTURER_ID), -- Связь с LECTURER
FOREIGN KEY (SUBJ_ID) REFERENCES SUBJECT(SUBJ_ID) -- Связь с SUBJECT
);
-- ТАБЛИЦА 6: ЭКЗАМЕНАЦИОННЫЕ ОЦЕНКИ
CREATE TABLE EXAM_MARKS (
EXAM_ID INTEGER PRIMARY KEY, -- Уникальный идентификатор экзамена
STUDENT_ID INTEGER, -- Идентификатор студента (внешний ключ)
SUBJ_ID INTEGER, -- Идентификатор дисциплины (внешний ключ)
MARK INTEGER, -- Оценка за экзамен
EXAM_DATE DATE, -- Дата экзамена
FOREIGN KEY (STUDENT_ID) REFERENCES STUDENT(STUDENT_ID), -- Связь с STUDENT
FOREIGN KEY (SUBJ_ID) REFERENCES SUBJECT(SUBJ_ID) -- Связь с SUBJECT
);
-- =============================================
-- ЗАПОЛНЕНИЕ ТАБЛИЦ ДАННЫМИ
-- =============================================
-- ЗАПОЛНЕНИЕ ТАБЛИЦЫ UNIVERSITY (10 УНИВЕРСИТЕТОВ)
Insert into university (univ_id, univ_name, rating, city) values
(1, 'Московский государственный университет', 95, 'Москва'),
(2, 'Санкт-Петербургский государственный университет', 90, 'Санкт-Петербург'),
(3, 'Новосибирский государственный университет', 85, 'Новосибирск'),
(4, 'Казанский федеральный университет', 80, 'Казань'),
(5, 'Уральский федеральный университет', 78, 'Екатеринбург'),
(6, 'Томский государственный университет', 82, 'Томск'),
(7, 'Российский университет дружбы народов', 88, 'Москва'),
(8, 'Московский физико-технический институт', 92, 'Москва'),
(9, 'Высшая школа экономики', 89, 'Москва'),
(10, 'Сибирский федеральный университет', 79, 'Красноярск');
-- ЗАПОЛНЕНИЕ ТАБЛИЦЫ STUDENT (20 СТУДЕНТОВ)
Insert into student (student_id, surname, name, stipend, kurs, city, birthday, univ_id) values
(1, 'Иванов', 'Алексей', 1500.00, 2, 'Москва', '2000-05-15', 1),
(2, 'Петрова', 'Мария', 1700.00, 1, 'Санкт-Петербург', '2001-08-22', 2),
(3, 'Сидоров', 'Дмитрий', 0.00, 3, 'Новосибирск', '1999-11-30', 3),
(4, 'Кузнецова', 'Анна', 2000.00, 2, 'Москва', '2000-03-10', 1),
(5, 'Смирнов', 'Михаил', 1200.00, 1, 'Казань', '2001-12-05', 4),
(6, 'Попов', 'Артем', 1800.00, 4, 'Екатеринбург', '1998-07-18', 5),
(7, 'Васильева', 'Елена', 0.00, 2, 'Санкт-Петербург', '2000-09-25', 2),
(8, 'Новиков', 'Сергей', 1600.00, 3, 'Москва', '1999-04-12', 1),
(9, 'Федорова', 'Ольга', 1400.00, 1, 'Новосибирск', '2001-06-08', 3),
(10, 'Морозов', 'Иван', 1900.00, 4, 'Казань', '1998-02-14', 4),
(11, 'Волкова', 'Наталья', 0.00, 2, 'Екатеринбург', '2000-11-03', 5),
(12, 'Алексеев', 'Павел', 1300.00, 3, 'Москва', '1999-08-19', 1),
(13, 'Лебедева', 'Ирина', 1700.00, 1, 'Санкт-Петербург', '2001-01-27', 2),
(14, 'Семенов', 'Андрей', 1500.00, 4, 'Новосибирск', '1998-10-11', 3),
(15, 'Егорова', 'Татьяна', 0.00, 2, 'Казань', '2000-07-06', 4),
(16, 'Козлов', 'Роман', 1600.00, 3, 'Екатеринбург', '1999-12-22', 5),
(17, 'Орлова', 'Юлия', 1400.00, 1, 'Москва', '2001-04-30', 1),
(18, 'Захаров', 'Виктор', 1800.00, 4, 'Санкт-Петербург', '1998-09-15', 2),
(19, 'Ильина', 'Марина', 0.00, 2, 'Новосибирск', '2000-02-08', 3),
(20, 'Григорьев', 'Александр', 2000.00, 3, 'Казань', '1999-05-21', 4);
-- ЗАПОЛНЕНИЕ ТАБЛИЦЫ LECTURER (15 ПРЕПОДАВАТЕЛЕЙ)
Insert into lecturer (lecturer_id, surname, name, city, univ_id) values
(1, 'Смирнов', 'Виктор', 'Москва', 1),
(2, 'Кузнецова', 'Ольга', 'Санкт-Петербург', 2),
(3, 'Петров', 'Андрей', 'Новосибирск', 3),
(4, 'Иванова', 'Елена', 'Казань', 4),
(5, 'Сидорова', 'Мария', 'Екатеринбург', 5),
(6, 'Васильев', 'Дмитрий', 'Томск', 6),
(7, 'Николаева', 'Анна', 'Москва', 7),
(8, 'Федоров', 'Сергей', 'Москва', 8),
(9, 'Алексеева', 'Ирина', 'Москва', 9),
(10, 'Павлов', 'Максим', 'Красноярск', 10),
(11, 'Кириллов', 'Артем', 'Москва', 1),
(12, 'Тихонова', 'Светлана', 'Санкт-Петербург', 2),
(13, 'Белов', 'Александр', 'Новосибирск', 3),
(14, 'Комарова', 'Надежда', 'Казань', 4),
(15, 'Щербаков', 'Роман', 'Екатеринбург', 5);
-- ЗАПОЛНЕНИЕ ТАБЛИЦЫ SUBJECT (25 ДИСЦИПЛИН)
Insert into subject (subj_id, subj_name, hour, semester) values
(1, 'Математика', 120, 1),
(2, 'Физика', 90, 2),
(3, 'Информатика', 110, 1),
(4, 'История', 80, 3),
(5, 'Программирование', 150, 2),
(6, 'Базы данных', 100, 3),
(7, 'Алгоритмы и структуры данных', 130, 4),
(8, 'Операционные системы', 95, 5),
(9, 'Компьютерные сети', 85, 6),
(10, 'Искусственный интеллект', 110, 7),
(11, 'Веб-разработка', 120, 4),
(12, 'Мобильная разработка', 100, 5),
(13, 'Тестирование ПО', 80, 6),
(14, 'Управление проектами', 70, 7),
(15, 'Английский язык', 140, 1),
(16, 'Философия', 60, 2),
(17, 'Экономика', 75, 3),
(18, 'Право', 65, 4),
(19, 'Психология', 70, 5),
(20, 'Статистика', 90, 6),
(21, 'Машинное обучение', 120, 7),
(22, 'Кибербезопасность', 95, 4),
(23, 'Графика и дизайн', 85, 5),
(24, 'Анализ данных', 110, 6),
(25, 'Разработка игр', 100, 7);
-- ЗАПОЛНЕНИЕ ТАБЛИЦЫ SUBJ_LECT (25 СВЯЗЕЙ)
INSERT INTO SUBJ_LECT (LECTURER_ID, SUBJ_ID) VALUES
(1, 1), (1, 3), (2, 2), (2, 5), (3, 4),
(4, 6), (5, 7), (6, 8), (7, 9), (8, 10),
(9, 11), (10, 12), (11, 13), (12, 14), (13, 15),
(14, 16), (15, 17), (1, 18), (2, 19), (3, 20),
(4, 21), (5, 22), (6, 23), (7, 24), (8, 25);
-- ЗАПОЛНЕНИЕ ТАБЛИЦЫ EXAM_MARKS (25 ЭКЗАМЕНОВ)
INSERT INTO EXAM_MARKS (EXAM_ID, STUDENT_ID, SUBJ_ID, MARK, EXAM_DATE) VALUES
(1, 1, 1, 5, '2023-12-20'),
(2, 2, 2, 4, '2023-12-22'),
(3, 3, 3, 5, '2023-12-25'),
(4, 4, 1, 3, '2023-12-20'),
(5, 5, 4, 4, '2023-12-28'),
(6, 6, 5, 5, '2023-12-30'),
(7, 7, 6, 4, '2024-01-10'),
(8, 8, 7, 5, '2024-01-12'),
(9, 9, 8, 3, '2024-01-15'),
(10, 10, 9, 4, '2024-01-18'),
(11, 11, 10, 5, '2024-01-20'),
(12, 12, 11, 4, '2024-01-22'),
(13, 13, 12, 3, '2024-01-25'),
(14, 14, 13, 5, '2024-01-28'),
(15, 15, 14, 4, '2024-01-30'),
(16, 16, 15, 5, '2024-02-01'),
(17, 17, 16, 3, '2024-02-03'),
(18, 18, 17, 4, '2024-02-05'),
(19, 19, 18, 5, '2024-02-07'),
(20, 20, 19, 4, '2024-02-09'),
(21, 1, 20, 5, '2024-02-11'),
(22, 2, 21, 3, '2024-02-13'),
(23, 3, 22, 4, '2024-02-15'),
(24, 4, 23, 5, '2024-02-17'),
(25, 5, 24, 4, '2024-02-19');
-- =============================================
-- ПРОВЕРКА СОЗДАННЫХ ДАННЫХ
-- =============================================
-- ПРОВЕРКА КОЛИЧЕСТВА ЗАПИСЕЙ В КАЖДОЙ ТАБЛИЦЕ
SELECT 'UNIVERSITY' as Таблица, COUNT(*) as Количество FROM UNIVERSITY
UNION ALL SELECT 'STUDENT', COUNT(*) FROM STUDENT
UNION ALL SELECT 'LECTURER', COUNT(*) FROM LECTURER
UNION ALL SELECT 'SUBJECT', COUNT(*) FROM SUBJECT
UNION ALL SELECT 'SUBJ_LECT', COUNT(*) FROM SUBJ_LECT
UNION ALL SELECT 'EXAM_MARKS', COUNT(*) FROM EXAM_MARKS;
-- ПРОСМОТР ДАННЫХ ИЗ КАЖДОЙ ТАБЛИЦЫ
SELECT * FROM UNIVERSITY;
SELECT * FROM STUDENT;
SELECT * FROM LECTURER;
SELECT * FROM SUBJECT;
SELECT * FROM SUBJ_LECT;
SELECT * FROM EXAM_MARKS;
-- ПРИМЕР СЛОЖНОГО ЗАПРОСА (ДЕМОНСТРАЦИЯ СВЯЗЕЙ)
SELECT
s.STUDENT_ID as 'ID студента',
s.SURNAME as 'Фамилия',
s.NAME as 'Имя',
u.UNIV_NAME as 'Университет',
sub.SUBJ_NAME as 'Дисциплина',
em.MARK as 'Оценка',
em.EXAM_DATE as 'Дата экзамена'
FROM STUDENT s
JOIN UNIVERSITY u ON s.UNIV_ID = u.UNIV_ID
JOIN EXAM_MARKS em ON s.STUDENT_ID = em.STUDENT_ID
JOIN SUBJECT sub ON em.SUBJ_ID = sub.SUBJ_ID
ORDER BY s.SURNAME, em.EXAM_DATE;
