Giờ tụi mình dành chút thời gian ôn lại những gì đã học nhé. Cứ đi từng bước một cho dễ hiểu. Phía sau còn nhiều thứ sẽ dựa trên mấy cái này, nên tốt nhất là bạn phải hiểu rõ từng lệnh đang làm gì.
Ôn lại ví dụ về sinh viên và khoá học từ đầu luôn. Từ lúc tạo bảng cho tới lúc phân tích từng bước. Sẵn sàng chưa?
Bây giờ mình sẽ tạo bảng students để lưu thông tin sinh viên, và liên kết nó với bảng courses bằng foreign key. Trong quá trình này bạn sẽ thấy cách dùng foreign key để mô hình hoá quan hệ giữa các entity.
Tạo bảng students
Bảng students sẽ lưu thông tin sinh viên: id duy nhất, tên và ngày sinh. Mình sẽ tạo nó bằng lệnh CREATE TABLE.
CREATE TABLE students (
student_id SERIAL PRIMARY KEY, -- Khoá duy nhất cho mỗi dòng
name TEXT NOT NULL, -- Tên sinh viên (bắt buộc)
birth_date DATE -- Ngày sinh của sinh viên
);
Ở đây có gì?
student_id SERIAL PRIMARY KEY: Đây là id duy nhất cho mỗi sinh viên. KiểuSERIALsẽ tự động tăng, cònPRIMARY KEYđảm bảo id này là duy nhất cho từng dòng.name TEXT NOT NULL: Trường lưu tên sinh viên. Mình đểNOT NULLđể không ai được thêm sinh viên mà không có tên.birth_date DATE: Trường lưu ngày sinh. Kiểu dữ liệuDATEgiúp mình làm việc với ngày tháng dễ hơn.
Nếu bảng là một người, thì student_id là chứng minh thư, name là tên rõ ràng, còn birth_date là cái mà đôi khi tụi mình muốn giấu, nhưng database thì cần phải có.
Tạo bảng courses
Giờ mình tạo bảng lưu thông tin khoá học. Nó sẽ có id khoá học, tên và mô tả.
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- Id duy nhất cho khoá học
title TEXT NOT NULL, -- Tên khoá học (bắt buộc)
description TEXT -- Mô tả khoá học
);
Ở đây có gì?
course_id SERIAL PRIMARY KEY: Tương tự, trường này tự động tăng và tạo id duy nhất cho mỗi khoá học.title TEXT NOT NULL: Trường lưu tên khoá học. Đã là khoá học thì phải có tên chứ nhỉ.description TEXT: Trường mô tả ngắn về khoá học. Trường này không bắt buộc (NOT NULLkhông có).
Khoá học mà không có tên thì như sách không có bìa vậy. Nhưng database sẽ không cho phép chuyện đó đâu!
Liên kết bảng students với bảng courses
Giả sử mỗi sinh viên chỉ được đăng ký một khoá học thôi. Để làm vậy, mình sẽ thêm foreign key vào bảng courses, tham chiếu tới id sinh viên trong bảng students.
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY, -- Id duy nhất cho khoá học
title TEXT NOT NULL, -- Tên khoá học (bắt buộc)
description TEXT, -- Mô tả khoá học
student_id INT REFERENCES students(student_id) -- Foreign key liên kết với bảng students
);
student_id INT REFERENCES students(student_id) làm gì vậy?
- Mình tạo trường
student_id, nó sẽ tham chiếu tới id duy nhất (student_id) trong bảngstudents. - Liên kết giữa hai bảng được đảm bảo bằng từ khoá
REFERENCES. - Có nghĩa là mỗi lần thêm dữ liệu vào
courses, giá trịstudent_idphải tồn tại trong bảngstudents. Nếu bạn thử thêm khoá học cho sinh viên không tồn tạistudent_id, sẽ bị lỗi ngay.
Thêm dữ liệu vào bảng
Bảng đã tạo xong rồi, giờ thêm vài sinh viên và khoá học cho vui. Chứ ngồi lớp trống thì chán lắm nhỉ?
Thêm sinh viên
INSERT INTO students (name, birth_date) VALUES
('Alex Lin', '2000-05-10'),
('Maria Chi', '1998-02-15'),
('Otto Song', '2001-09-25');
Thêm khoá học
INSERT INTO courses (title, description, student_id) VALUES
('Những điều cơ bản về SQL', 'Học cú pháp cơ bản của SQL', 1),
('Cơ sở dữ liệu quan hệ', 'Hiểu mô hình quan hệ', 2),
('PostgreSQL cho người mới bắt đầu', 'Cài đặt và cấu hình PostgreSQL', 3);
Mình đã chỉ định student_id cho từng khoá học, liên kết nó với id sinh viên trong bảng students.
Kiểm tra liên kết giữa các bảng
Giờ kiểm tra xem hai bảng đã liên kết chưa nhé. Tạo truy vấn để lấy thông tin khoá học cùng tên sinh viên luôn.
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;
Ví dụ kết quả: Kết quả truy vấn:
| course_title | course_description | student_name |
|---|---|---|
| Những điều cơ bản về SQL | Học cú pháp cơ bản của SQL | Alex Lin |
| Cơ sở dữ liệu quan hệ | Hiểu mô hình quan hệ | Maria Chi |
| PostgreSQL cho người mới bắt đầu | Cài đặt và cấu hình PostgreSQL | Otto Song |
Mình đã liên kết khoá học với sinh viên qua foreign key — giờ có thể lấy dữ liệu liên quan chỉ với một truy vấn. Đó chính là cách mô hình quan hệ hoạt động!
Tóm tắt
Hy vọng mọi thứ vừa học đều rõ ràng với bạn nhé. Vì sắp tới tụi mình sẽ học tiếp, nên nhớ tự tin với kiến thức của mình nha.
GO TO FULL VERSION