CodeGym /Các khóa học /SQL SELF /Tạo bảng students và liên kết với bảng

Tạo bảng students và liên kết với bảng courses

SQL SELF
Mức độ , Bài học
Có sẵn

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ì?

  1. student_id SERIAL PRIMARY KEY: Đây là id duy nhất cho mỗi sinh viên. Kiểu SERIAL sẽ tự động tăng, còn PRIMARY KEY đảm bảo id này là duy nhất cho từng dòng.
  2. 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.
  3. birth_date DATE: Trường lưu ngày sinh. Kiểu dữ liệu DATE giú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ì?

  1. 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.
  2. 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ỉ.
  3. description TEXT: Trường mô tả ngắn về khoá học. Trường này không bắt buộc (NOT NULL khô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?

  1. Mình tạo trường student_id, nó sẽ tham chiếu tới id duy nhất (student_id) trong bảng students.
  2. Liên kết giữa hai bảng được đảm bảo bằng từ khoá REFERENCES.
  3. Có nghĩa là mỗi lần thêm dữ liệu vào courses, giá trị student_id phải tồn tại trong bảng students. Nếu bạn thử thêm khoá học cho sinh viên không tồn tại student_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.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION