Давай виділимо трохи часу і пройдемося по вже вивченому матеріалу. Ось прям по кроках розберемо все, що відбувається. Далі буде багато всього, що базується на тому, що ти вже знаєш. І класно було б, щоб ти ну прям ідеально розумів, що відбувається при виконанні кожної команди.
Давай ще раз пройдемося по нашому прикладу зі студентами і курсами. З самого початку. Від створення таблиць до розбору, що відбувається на кожному етапі. Готовий?
Зараз ми створимо таблицю students, яка буде зберігати інформацію про студентів, і зв'яжемо її з таблицею courses за допомогою зовнішнього ключа. У цьому процесі ми побачимо, як застосовуються зовнішні ключі для моделювання відносин між сутностями.
Створення таблиці students
Таблиця students буде зберігати інформацію про студентів: їх унікальний ідентифікатор, ім'я і дату народження. Ми створимо її з використанням команди CREATE TABLE.
CREATE TABLE students (
student_id SERIAL PRIMARY KEY, -- Унікальний ключ для кожного запису
name TEXT NOT NULL, -- Ім'я студента (обов'язкове поле)
birth_date DATE -- Дата народження студента
);
Що тут відбувається?
student_id SERIAL PRIMARY KEY: Це унікальний ідентифікатор для кожного студента. ТипSERIALстворює автоінкрементне поле, аPRIMARY KEYгарантує, що ідентифікатор буде унікальним для кожного рядка.name TEXT NOT NULL: Поле для імені студента. Ми вказалиNOT NULL, щоб жоден запис не міг бути доданий без імені.birth_date DATE: Поле для зберігання дати народження. Тут тип данихDATEдопоможе нам працювати з датами.
Якби таблиця була людиною, то student_id — це її паспорт, name — очевидне ім'я, а birth_date — те, що ми іноді ховаємо подалі, але для бази даних це важливо.
Створення таблиці courses
Тепер створимо таблицю, яка буде зберігати інформацію про курси. Вона буде містити ідентифікатор курсу, його назву і опис.
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- Унікальний ідентифікатор курсу
title TEXT NOT NULL, -- Назва курсу (обов'язкове поле)
description TEXT -- Опис курсу
);
Що тут відбувається?
course_id SERIAL PRIMARY KEY: Аналогічно, це автоінкрементне поле, яке створює унікальний ідентифікатор для кожного курсу.title TEXT NOT NULL: Поле для назви курсу. Ми вказалиNOT NULL, бо логічно, що у будь-якого курсу має бути ім'я.description TEXT: Поле для короткого опису курсу. Це вже додаткове поле, яке може бути порожнім (без обмеженняNOT NULL).
Курс без назви — це як книжка без обкладинки. Але база даних цього не дозволить!
Зв'язування таблиці students з таблицею courses
Тепер уявімо, що кожен студент може бути записаний тільки на один курс. Для цього ми додамо зовнішній ключ у таблицю courses, який буде посилатися на ідентифікатор студента з таблиці students.
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- Унікальний ідентифікатор курсу
title TEXT NOT NULL, -- Назва курсу (обов'язкове поле)
description TEXT, -- Опис курсу
student_id INT REFERENCES students(student_id) -- Зовнішній ключ, що зв'язує з таблицею students
);
Що робить student_id INT REFERENCES students(student_id)?
- Ми створюємо поле
student_id, яке буде посиланням на унікальний ідентифікатор студента (student_id) з таблиціstudents. - Зв'язок між таблицями забезпечується ключовим словом
REFERENCES. - Це означає, що при кожній вставці даних у
coursesзначенняstudent_idмає існувати в таблиціstudents. Якщо, наприклад, ти спробуєш записати на курс студента з неіснуючимstudent_id, отримаєш помилку.
Вставка даних у таблиці
Коли таблиці створені, давай додамо трохи студентів і курсів. Бо сидіти в порожній аудиторії — ну реально нудно, правда?
Додаємо студентів
INSERT INTO students (name, birth_date) VALUES
('Alex Lin', '2000-05-10'),
('Maria Chi', '1998-02-15'),
('Otto Song', '2001-09-25');
Додаємо курси
INSERT INTO courses (title, description, student_id) VALUES
('Основи SQL', 'Вивчення базового синтаксису SQL', 1),
('Реляційні бази даних', 'Розуміння реляційних моделей', 2),
('PostgreSQL для початківців', 'Встановлення і налаштування PostgreSQL', 3);
Ми вказали student_id для кожного курсу, зв'язуючи його з ідентифікатором студента в таблиці students.
Перевіряємо зв'язок між таблицями
Тепер давай переконаємось, що наші таблиці дійсно зв'язані. Для цього створимо запит, який виведе інформацію про курси разом з іменами студентів.
SELECT
courses.title AS course_title,
courses.description AS course_description,
students.name AS student_name
FROM
courses
JOIN
students ON courses.student_id = students.student_id;
Приклад результату: Результат запиту:
| course_title | course_description | student_name |
|---|---|---|
| Основи SQL | Вивчення базового синтаксису SQL | Alex Lin |
| Реляційні бази даних | Розуміння реляційних моделей | Maria Chi |
| PostgreSQL для початківців | Встановлення і налаштування PostgreSQL | Otto Song |
Ми зв'язали курси зі студентами через зовнішній ключ — і тепер можемо отримувати пов'язані дані в одному запиті. Ось так працює реляційна модель!
Резюме
Я сподіваюся, що все, що ми щойно розібрали, було для тебе зрозумілим і очевидним. Бо скоро ми підемо далі, і хотілося б, щоб ти був впевнений у своїх знаннях.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ