Базовый курс SQL. Создаём тестовую БД

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);

Следующая страница. Приложения. Как работать с СУБД и запускать примеры.
Оглавление.

vedro-compota's picture

м.б. имеет смысл сразу определять внутри таблицы ограничения ключей?

_____________
матфак вгу и остальная классика =)