Dobra, poświęćmy chwilę i przejdźmy jeszcze raz przez to, co już przerabialiśmy. Krok po kroku rozkminimy wszystko, co się dzieje. Dalej będzie sporo rzeczy, które bazują na tym materiale, więc fajnie by było, żebyś naprawdę ogarniał, co się dzieje przy każdej komendzie.
Jeszcze raz przejdźmy przez nasz przykład ze studentami i kursami. Od samego początku. Od tworzenia tabel, po rozkminę co się dzieje na każdym etapie. Gotowy?
Teraz stworzymy tabelę students, która będzie przechowywać info o studentach, i połączymy ją z tabelą courses przez klucz obcy. W tym procesie zobaczysz, jak używać kluczy obcych do modelowania relacji między encjami.
Tworzenie tabeli students
Tabela students będzie przechowywać info o studentach: ich unikalny identyfikator, imię i datę urodzenia. Stworzymy ją za pomocą komendy CREATE TABLE.
CREATE TABLE students (
student_id SERIAL PRIMARY KEY, -- Unikalny klucz dla każdego rekordu
name TEXT NOT NULL, -- Imię studenta (pole wymagane)
birth_date DATE -- Data urodzenia studenta
);
Co tu się dzieje?
student_id SERIAL PRIMARY KEY: To jest unikalny identyfikator dla każdego studenta. TypSERIALrobi autoinkrementowane pole, aPRIMARY KEYgwarantuje, że identyfikator będzie unikalny dla każdego wiersza.name TEXT NOT NULL: Pole na imię studenta. UstawiliśmyNOT NULL, żeby nie dało się dodać rekordu bez imienia.birth_date DATE: Pole na datę urodzenia. Typ danychDATEpozwala nam ogarniać daty.
Gdyby tabela była człowiekiem, to student_id — to jej dowód, name — oczywiste imię, a birth_date — coś, co czasem chowamy, ale dla bazy danych to ważne info.
Tworzenie tabeli courses
Teraz stworzymy tabelę, która będzie przechowywać info o kursach. Będzie mieć identyfikator kursu, jego nazwę i opis.
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- Unikalny identyfikator kursu
title TEXT NOT NULL, -- Nazwa kursu (pole wymagane)
description TEXT -- Opis kursu
);
Co tu się dzieje?
course_id SERIAL PRIMARY KEY: Podobnie, to autoinkrementowane pole, które tworzy unikalny identyfikator dla każdego kursu.title TEXT NOT NULL: Pole na nazwę kursu. UstawiliśmyNOT NULL, bo logiczne, że każdy kurs musi mieć nazwę.description TEXT: Pole na krótki opis kursu. To już dodatkowe pole, które może być puste (bezNOT NULL).
Kurs bez nazwy — to jak książka bez okładki. Ale baza danych na to nie pozwoli!
Łączenie tabeli students z tabelą courses
Wyobraź sobie teraz, że każdy student może być zapisany tylko na jeden kurs. Do tego dodamy klucz obcy do tabeli courses, który będzie wskazywał na identyfikator studenta z tabeli students.
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- Unikalny identyfikator kursu
title TEXT NOT NULL, -- Nazwa kursu (pole wymagane)
description TEXT, -- Opis kursu
student_id INT REFERENCES students(student_id) -- Klucz obcy, łączący z tabelą students
);
Co robi student_id INT REFERENCES students(student_id)?
- Tworzymy pole
student_id, które będzie wskazywać na unikalny identyfikator studenta (student_id) z tabelistudents. - Relacja między tabelami jest ustawiona przez słowo kluczowe
REFERENCES. - To znaczy, że przy każdym INSERT do
courseswartośćstudent_idmusi istnieć w tabelistudents. Jeśli np. spróbujesz zapisać na kurs studenta z nieistniejącymstudent_id, dostaniesz błąd.
Wstawianie danych do tabel
Jak już mamy tabele, to wrzućmy trochę studentów i kursów. Bo nudno siedzieć w pustej sali, nie?
Dodajemy studentów
INSERT INTO students (name, birth_date) VALUES
('Alex Lin', '2000-05-10'),
('Maria Chi', '1998-02-15'),
('Otto Song', '2001-09-25');
Dodajemy kursy
INSERT INTO courses (title, description, student_id) VALUES
('Podstawy SQL', 'Nauka podstawowej składni SQL', 1),
('Relacyjne bazy danych', 'Zrozumienie modeli relacyjnych', 2),
('PostgreSQL dla początkujących', 'Instalacja i konfiguracja PostgreSQL', 3);
Podaliśmy student_id dla każdego kursu, łącząc go z identyfikatorem studenta w tabeli students.
Sprawdzamy powiązanie między tabelami
Teraz sprawdźmy, czy nasze tabele faktycznie są połączone. Do tego stworzymy zapytanie, które wyświetli info o kursach razem z imionami studentów.
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;
Przykład wyniku: Wynik zapytania:
| course_title | course_description | student_name |
|---|---|---|
| Podstawy SQL | Nauka podstawowej składni SQL | Alex Lin |
| Relacyjne bazy danych | Zrozumienie modeli relacyjnych | Maria Chi |
| PostgreSQL dla początkujących | Instalacja i konfiguracja PostgreSQL | Otto Song |
Połączyliśmy kursy ze studentami przez klucz obcy — i teraz możemy pobierać powiązane dane jednym zapytaniem. Tak właśnie działa model relacyjny!
Podsumowanie
Mam nadzieję, że wszystko, co właśnie przerobiliśmy, było dla Ciebie jasne i oczywiste. Bo zaraz idziemy dalej i fajnie by było, żebyś był pewny swojej wiedzy.
GO TO FULL VERSION