Базовый курс SQL. Создаём тестовую БД
Primary tabs
Forums:
Для эффективного изучения SQL обязательно ЗАПУСКАЙТЕ все примеры, которые встретите в курсе. Давайте вместе создадим для этого тестовую базу данных.
Основные правила
- В каждой таблице обязательно определяйте первичные ключи (primary keys). Они обеспечивают возможность обратиться персонально к каждой строке.
- Для создания связей между таблицами определите внешние ключи (foreign keys). С помощью них мы сможем получать данные связанных таблиц одним запросом.
Для наглядного представления всех наших данных составим схему БД. Это можно сделать с помощью UML-разметки или любых других визуальных инструментов.
Код создания таблиц для СУБД PostgreSQL
-- ----------------------- -- Создаем таблицу Students -- ----------------------- CREATE TABLE Students ( student_id int NOT NULL , student_name char(50) NOT NULL , student_surname char(50) NOT NULL , student_gender char(1) NOT NULL , student_age int NOT NULL , student_country char(50) NOT NULL , student_email char(255) , group_id int NOT NULL ); -- ------------------------ -- Создаем таблицу Groups (Группы) -- ------------------------ CREATE TABLE Groups ( group_id int NOT NULL , group_name char(10) NOT NULL , curator_id int NOT NULL, faculty_id int NOT NULL, semester_id int NOT NULL ); -- -------------------- -- Создаем таблицу Teachers (Учителя) -- -------------------- CREATE TABLE Teachers ( teacher_id int NOT NULL , teacher_name char(50) NOT NULL , teacher_surname char(50) NOT NULL , teacher_middle_name char(50) ); -- ---------------------- -- Создаем таблицу Disciplines (Дисцилины/Предметы) -- ---------------------- CREATE TABLE Disciplines ( discipline_id int NOT NULL , discipline_name char(255) NOT NULL , faculty_id int NOT NULL , teacher_id int NOT NULL ); -- --------------------- -- Создаем таблицу Exams (Экзамены) -- --------------------- CREATE TABLE Exams ( exam_id int NOT NULL , room_number char(6) , session_id int NOT NULL, discipline_id int NOT NULL ); -- ---------------------- -- Создаем таблицу Sessions - конкретные сессии, назначенные группе -- ---------------------- CREATE TABLE Sessions ( session_id int NOT NULL , session_start_date date NOT NULL , session_end_date date NOT NULL , group_id int NOT NULL , semester_id int NOT NULL ); -- ---------------------- -- Создаем таблицу Semesters (Семестры) - возможные номера семестров (1 - 10) -- ---------------------- CREATE TABLE Semesters ( semester_id int NOT NULL , semester_number int NOT NULL ); -- ---------------------- -- Создаем таблицу Faculties (Факультеты) -- ---------------------- CREATE TABLE Faculties ( faculty_id int NOT NULL , faculty_name char(255) NOT NULL ); -- ---------------------- -- Создаем таблицу OldFaculties (Старые факультеты) -- ---------------------- CREATE TABLE OldFaculties ( old_faculty_id int NOT NULL , old_faculty_name char(255) NOT NULL ); -- ---------------------- -- Создаем таблицу Contests (Конкурсы/Соревнования) -- ---------------------- CREATE TABLE Contests ( contest_id int NOT NULL , contest_name char(255) NOT NULL , contest_date date NOT NULL ); -- ---------------------- -- Создаем таблицу Participants (Практиканты) -- ---------------------- CREATE TABLE Participants ( participant_id int NOT NULL , contest_id int NOT NULL , student_id int NOT NULL , first_round_points int , second_round_points int ); -- ----------------------- -- Создаем таблицу Grades (Оценки) -- ----------------------- CREATE TABLE Grades ( grade_id int NOT NULL , grade_value int NOT NULL , student_id int NOT NULL , exam_id int NOT NULL ); -- -------------------- -- Определяем основные ключи таблиц -- -------------------- ALTER TABLE Students ADD PRIMARY KEY (student_id); ALTER TABLE Groups ADD PRIMARY KEY (group_id); ALTER TABLE Teachers ADD PRIMARY KEY (teacher_id); ALTER TABLE Disciplines ADD PRIMARY KEY (discipline_id); ALTER TABLE Exams ADD PRIMARY KEY (exam_id); ALTER TABLE Sessions ADD PRIMARY KEY (session_id); ALTER TABLE Semesters ADD PRIMARY KEY (semester_id); ALTER TABLE Faculties ADD PRIMARY KEY (faculty_id); ALTER TABLE Contests ADD PRIMARY KEY (contest_id); ALTER TABLE Participants ADD PRIMARY KEY (participant_id); ALTER TABLE Grades ADD PRIMARY KEY (grade_id); -- -------------------- -- Определяем внешние ключи -- -------------------- ALTER TABLE Students ADD CONSTRAINT FK_Students_Groups FOREIGN KEY (group_id) REFERENCES Groups (group_id); ALTER TABLE Groups ADD CONSTRAINT FK_Groups_Teachers FOREIGN KEY (curator_id) REFERENCES Teachers (teacher_id); ALTER TABLE Groups ADD CONSTRAINT FK_Groups_Faculties FOREIGN KEY (faculty_id) REFERENCES Faculties (faculty_id); ALTER TABLE Groups ADD CONSTRAINT FK_Groups_Semesters FOREIGN KEY (semester_id) REFERENCES Semesters (semester_id); ALTER TABLE Disciplines ADD CONSTRAINT FK_Disciplines_Teachers FOREIGN KEY (teacher_id) REFERENCES Teachers (teacher_id); ALTER TABLE Disciplines ADD CONSTRAINT FK_Disciplines_Faculties FOREIGN KEY (faculty_id) REFERENCES Faculties (faculty_id); ALTER TABLE Exams ADD CONSTRAINT FK_Exams_Sessions FOREIGN KEY (session_id) REFERENCES Sessions (session_id); ALTER TABLE Exams ADD CONSTRAINT FK_Exams_Disciplines FOREIGN KEY (discipline_id) REFERENCES Disciplines (discipline_id); ALTER TABLE Sessions ADD CONSTRAINT FK_Sessions_Groups FOREIGN KEY (group_id) REFERENCES Groups (group_id); ALTER TABLE Sessions ADD CONSTRAINT FK_Sessions_Semesters FOREIGN KEY (semester_id) REFERENCES Semesters (semester_id); ALTER TABLE Participants ADD CONSTRAINT FK_Participants_Contests FOREIGN KEY (contest_id) REFERENCES Contests (contest_id); ALTER TABLE Participants ADD CONSTRAINT FK_Participants_Students FOREIGN KEY (student_id) REFERENCES Students (student_id); ALTER TABLE Grades ADD CONSTRAINT FK_Grades_Exams FOREIGN KEY (exam_id) REFERENCES Exams (exam_id); ALTER TABLE Grades ADD CONSTRAINT FK_Grades_Students FOREIGN KEY (student_id) REFERENCES Students (student_id);
Код заполнения таблиц данными
-- -------------------------- -- Заполнение таблицы Semesters -- -------------------------- INSERT INTO Semesters(semester_id, semester_number) VALUES(1, '1'); INSERT INTO Semesters(semester_id, semester_number) VALUES(5, '5'); INSERT INTO Semesters(semester_id, semester_number) VALUES(7, '7'); -- -------------------------- -- Заполнение таблицы Faculties -- -------------------------- INSERT INTO Faculties(faculty_id, faculty_name) VALUES(7, 'Компьютерных технологий'); INSERT INTO Faculties(faculty_id, faculty_name) VALUES(3, 'Журналистика'); -- -------------------------- -- Заполнение таблицы OldFaculties -- -------------------------- INSERT INTO OldFaculties(old_faculty_id, old_faculty_name) VALUES(5, 'Исторический'); INSERT INTO OldFaculties(old_faculty_id, old_faculty_name) VALUES(8, 'Химический'); -- ------------------------ -- Заполнение таблицы Teachers -- ------------------------ INSERT INTO Teachers(teacher_id, teacher_surname, teacher_name, teacher_middle_name) VALUES(860, 'Смирнов', 'Евгений', 'Андреевич'); INSERT INTO Teachers(teacher_id, teacher_surname, teacher_name, teacher_middle_name) VALUES(778, 'Игнатьева', 'Екатерина', 'Михайловна'); INSERT INTO Teachers(teacher_id, teacher_surname, teacher_name, teacher_middle_name) VALUES(891, 'Колесникова', 'Марина', 'Викторовна'); INSERT INTO Teachers(teacher_id, teacher_surname, teacher_name, teacher_middle_name) VALUES(1003, 'Донских', 'Иван', 'Геннадьевич'); INSERT INTO Teachers(teacher_id, teacher_surname, teacher_name, teacher_middle_name) VALUES(1025, 'Потапова', 'Мария', 'Андреевна'); INSERT INTO Teachers(teacher_id, teacher_surname, teacher_name, teacher_middle_name) VALUES(918, 'Ростовская', 'Ангелина', 'Анатольевна'); INSERT INTO Teachers(teacher_id, teacher_surname, teacher_name, teacher_middle_name) VALUES(936, 'Спрут', 'Олег', 'Иванович'); INSERT INTO Teachers(teacher_id, teacher_surname, teacher_name, teacher_middle_name) VALUES(919, 'Ростовский', 'Дмитрий', 'Анатольевич'); -- -------------------------- -- Заполнение таблицы Disciplines -- -------------------------- INSERT INTO Disciplines(discipline_id, discipline_name, faculty_id, teacher_id) VALUES(48, 'Философия', 7, 860); INSERT INTO Disciplines(discipline_id, discipline_name, faculty_id, teacher_id) VALUES(13, 'Технологии программирования', 7, 778); INSERT INTO Disciplines(discipline_id, discipline_name, faculty_id, teacher_id) VALUES(8, 'Математический анализ', 7, 891); INSERT INTO Disciplines(discipline_id, discipline_name, faculty_id, teacher_id) VALUES(10, 'Объектно-ориентированное программирование', 7, 891); INSERT INTO Disciplines(discipline_id, discipline_name, faculty_id, teacher_id) VALUES(35, 'Теория информации', 7, 1003); INSERT INTO Disciplines(discipline_id, discipline_name, faculty_id, teacher_id) VALUES(16, 'Компьютерная геометрия и графика', 7, 1025); INSERT INTO Disciplines(discipline_id, discipline_name, faculty_id, teacher_id) VALUES(24, 'Статистика', 7, 918); INSERT INTO Disciplines(discipline_id, discipline_name, faculty_id, teacher_id) VALUES(40, 'Дифференциальная геометрия', 7, 936); INSERT INTO Disciplines(discipline_id, discipline_name, faculty_id, teacher_id) VALUES(33, 'История', 7, 919); INSERT INTO Disciplines(discipline_id, discipline_name, faculty_id, teacher_id) VALUES(34, 'История', 3, 919); INSERT INTO Disciplines(discipline_id, discipline_name, faculty_id, teacher_id) VALUES(27, 'Социология', 3, 919); -- ----------------------- -- Заполнение таблицы Groups -- ----------------------- INSERT INTO Groups(group_id, group_name, curator_id, faculty_id, semester_id) VALUES(31548,'304F', 1025, 7, 5); INSERT INTO Groups(group_id, group_name, curator_id, faculty_id, semester_id) VALUES(33018,'580Z', 778, 3, 1); INSERT INTO Groups(group_id, group_name, curator_id, faculty_id, semester_id) VALUES(30913,'117F', 1003, 7, 7); -- ------------------------- -- Заполнение таблицы Students -- ------------------------- INSERT INTO Students(student_id, student_name, student_surname, student_gender, student_age, student_email, student_country, group_id) VALUES(92571, 'Аркадий', 'Петрашевский', 'M', 22, 'a_pet@mail.ru', 'РФ', 31548); INSERT INTO Students(student_id, student_name, student_surname, student_gender, student_age, student_email, student_country, group_id) VALUES(92522, 'Эра', 'Сейдинай', 'F', 25, 'seydinay345@mail.ru', 'Албания', 31548); INSERT INTO Students(student_id, student_name, student_surname, student_gender, student_age, student_email, student_country, group_id) VALUES(92435, 'Зинаида', 'Егорова', 'F', 19, 'zin-zin-eh@mail.ru', 'РФ', 30913); INSERT INTO Students(student_id, student_name, student_surname, student_gender, student_age, student_email, student_country, group_id) VALUES(92540, 'Пётр', 'Адамченко', 'M', 21, NULL, 'Украина', 31548); INSERT INTO Students(student_id, student_name, student_surname, student_gender, student_age, student_email, student_country, group_id) VALUES(92415, 'Базиль', 'Легран', 'M', 24, 'b.l@mail.ru', 'Франция', 30913); INSERT INTO Students(student_id, student_name, student_surname, student_gender, student_age, student_email, student_country, group_id) VALUES(92526, 'Еагений', 'Распопов', 'M', 22, 'evgeniy_ras@mail.ru', 'РФ', 31548); INSERT INTO Students(student_id, student_name, student_surname, student_gender, student_age, student_email, student_country, group_id) VALUES(92527, 'Дмитрий', 'Колобков', 'M', 22, 'kolodm@mail.ru', 'РФ', 31548); INSERT INTO Students(student_id, student_name, student_surname, student_gender, student_age, student_email, student_country, group_id) VALUES(92518, 'Ольга', 'Шульгина', 'F', 23, 'shulginaa@mail.ru', 'РФ', 31548); INSERT INTO Students(student_id, student_name, student_surname, student_gender, student_age, student_email, student_country, group_id) VALUES(92599, 'Григорий', 'Римский', 'M', 21, NULL, 'РФ', 33018); INSERT INTO Students(student_id, student_name, student_surname, student_gender, student_age, student_email, student_country, group_id) VALUES(92410, 'Вадим', 'Грошев', 'M', 20, 'vadim1881@mail.ru', 'РФ', 30913); -- -------------------------- -- Заполнение таблицы Sessions -- -------------------------- INSERT INTO Sessions(session_id, session_start_date, session_end_date, group_id, semester_id) VALUES(2350, '27-12-2020', '22-02-2021', 33018, 1); INSERT INTO Sessions(session_id, session_start_date, session_end_date, group_id, semester_id) VALUES(2442, '27-12-2020', '28-02-2021', 31548, 5); INSERT INTO Sessions(session_id, session_start_date, session_end_date, group_id, semester_id) VALUES(2413, '25-12-2020', '22-02-2021', 30913, 7); -- ---------------------- -- Заполнение таблицы Exams -- ---------------------- INSERT INTO Exams(exam_id, room_number, session_id, discipline_id) VALUES(20005, '201', 2350, 33); INSERT INTO Exams(exam_id, room_number, session_id, discipline_id) VALUES(20006, '325', 2350, 27); INSERT INTO Exams(exam_id, room_number, session_id, discipline_id) VALUES(20118, '104', 2442, 48); INSERT INTO Exams(exam_id, room_number, session_id, discipline_id) VALUES(20119, '3', 2442, 13); INSERT INTO Exams(exam_id, room_number, session_id, discipline_id) VALUES(20120, '115', 2442, 8); INSERT INTO Exams(exam_id, room_number, session_id, discipline_id) VALUES(20121, '408', 2442, 35); INSERT INTO Exams(exam_id, room_number, session_id, discipline_id) VALUES(20152, '115', 2413, 8); INSERT INTO Exams(exam_id, room_number, session_id, discipline_id) VALUES(20154, '408', 2413, 10); INSERT INTO Exams(exam_id, room_number, session_id, discipline_id) VALUES(20155, '104', 2413, 16); INSERT INTO Exams(exam_id, room_number, session_id, discipline_id) VALUES(20156, '213', 2413, 48); INSERT INTO Exams(exam_id, room_number, session_id, discipline_id) VALUES(20157, '104', 2413, 33); -- ---------------------- -- Заполнение таблицы Contests -- ---------------------- INSERT INTO Contests(contest_id, contest_name, contest_date) VALUES(165, 'Фотовыставка Технологии будущего', '25-10-2020'); -- ---------------------- -- Заполнение таблицы Participants -- ---------------------- INSERT INTO Participants(participant_id, contest_id, student_id, first_round_points, second_round_points) VALUES(2214, 165, 92540, 148, 115); INSERT INTO Participants(participant_id, contest_id, student_id, first_round_points, second_round_points) VALUES(2215, 165, 92526, 13, 36); INSERT INTO Participants(participant_id, contest_id, student_id, first_round_points, second_round_points) VALUES(2216, 165, 92518, 103, 59); INSERT INTO Participants(participant_id, contest_id, student_id, first_round_points, second_round_points) VALUES(2217, 165, 92522, 95, 124); INSERT INTO Participants(participant_id, contest_id, student_id, first_round_points, second_round_points) VALUES(2218, 165, 92435, 65, 89); -- ---------------------- -- Заполнение таблицы Grades -- ---------------------- INSERT INTO Grades(grade_id, grade_value, student_id, exam_id) VALUES(34221, 3, 92571, 20119); INSERT INTO Grades(grade_id, grade_value, student_id, exam_id) VALUES(34255, 4, 92571, 20154); INSERT INTO Grades(grade_id, grade_value, student_id, exam_id) VALUES(34567, 5, 92571, 20006); INSERT INTO Grades(grade_id, grade_value, student_id, exam_id) VALUES(34788, 4, 92522, 20119); INSERT INTO Grades(grade_id, grade_value, student_id, exam_id) VALUES(34579, 3, 92435, 20119);
Следующая страница. Приложения. Как работать с СУБД и запускать примеры.
Оглавление.
- Log in to post comments
- 3307 reads
vedro-compota
Wed, 08/04/2021 - 12:41
Permalink
м.б. имеет смысл сразу
м.б. имеет смысл сразу определять внутри таблицы ограничения ключей?
_____________
матфак вгу и остальная классика =)