CodeGym /Các khóa học /SQL SELF /Giới thiệu về kết hợp dữ liệu: JOIN

Giới thiệu về kết hợp dữ liệu: JOIN

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

Giới thiệu về kết hợp dữ liệu: JOIN

Hôm nay tụi mình sẽ chuyển sang một chủ đề siêu thú vị khi làm việc với cơ sở dữ liệu quan hệ — kết hợp dữ liệu từ nhiều bảng bằng JOIN. Đây là một công cụ cực mạnh, mở ra cánh cửa để tạo ra các mối liên kết phức tạp và phân tích dữ liệu sâu hơn.

Hãy tưởng tượng database của bạn giống như một bộ truyện tranh khổng lồ, mỗi bảng rời rạc là một khung hình riêng biệt. Để ghép thành một câu chuyện hoàn chỉnh, bạn cần nối các khung hình đó lại với nhau. Đó chính là lúc JOIN xuất hiện. Kết hợp dữ liệu là quá trình cho phép truy vấn lấy thông tin từ nhiều bảng và liên kết chúng dựa trên điều kiện nhất định.

Cơ sở dữ liệu quan hệ được xây dựng xoay quanh khái niệm liên kết giữa các bảng. Mỗi bảng lưu thông tin về một thực thể cụ thể, và để có cái nhìn đầy đủ hơn, tụi mình thường muốn liên kết dữ liệu từ các bảng khác nhau. Ví dụ nhé:

  • Bảng students chứa danh sách sinh viên.
  • Bảng courses lưu danh sách các khoá học.
  • Bảng enrollments cho biết ai đang học khoá nào.

Để biết sinh viên nào đang học khoá nào, tụi mình phải kết hợp các bảng này lại. Khi đi phỏng vấn, một dev biết dùng JOIN nhìn rất xịn, vì đây là một trong những kỹ năng hot nhất khi làm việc với dữ liệu.

Các loại JOIN cơ bản

Trong PostgreSQL có vài loại JOIN, mỗi loại lại phù hợp cho từng mục đích riêng. Mình sẽ giải thích sơ qua để bạn không bị ngợp bởi ví dụ phức tạp ngay từ đầu:

Loại JOIN Mô tả
INNER JOIN Trả về các dòng có giá trị khớp ở cả hai bảng.
LEFT JOIN Trả về tất cả các dòng từ bảng bên trái, còn bảng bên phải chỉ lấy dòng khớp.
RIGHT JOIN Trả về tất cả các dòng từ bảng bên phải, còn bảng bên trái chỉ lấy dòng khớp.
FULL OUTER JOIN Trả về tất cả các dòng từ cả hai bảng, điền NULL cho những chỗ không khớp.

Việc chọn loại JOIN nào tuỳ vào mục đích của bạn:

  • Nếu bạn chỉ cần dữ liệu khớp ở cả hai bảng, dùng INNER JOIN.
  • Nếu muốn giữ tất cả dữ liệu từ một bảng, còn bảng kia chỉ lấy phần khớp, dùng LEFT JOIN hoặc RIGHT JOIN.
  • Nếu cần tất cả dữ liệu từ cả hai bảng, kể cả không khớp, dùng FULL OUTER JOIN.

Cùng thực hành các kiểu JOIN này luôn nhé.

Ví dụ bài toán — "Ai học khoá nào?"

Giả sử tụi mình có ba bảng:

Bảng students

id name
1 Otto
2 Anna
3 Peter

Bảng courses

id title
101 Toán học
102 Tiếng Anh

Bảng enrollments

student_id course_id
1 101
2 102

Các bảng này liên kết với nhau như sau:

  • Cột id trong students — là mã định danh duy nhất của sinh viên.
  • Cột id trong courses — là mã định danh duy nhất của khoá học.
  • Trong bảng enrollments, các cột student_idcourse_id tạo liên kết giữa sinh viên và khoá học.

Giả sử bạn cần trả lời câu hỏi: sinh viên nào đăng ký khoá nào?

Câu trả lời có thể lấy bằng JOIN. Mình sẽ kết hợp các bảng dựa trên liên kết của chúng:

  • Kết nối studentsenrollments qua id = student_id.
  • Kết nối enrollmentscourses qua course_id = id.

Đây là SQL query sẽ như sau:

SELECT students.name, courses.title
FROM enrollments
JOIN students ON enrollments.student_id = students.id
JOIN courses ON enrollments.course_id = courses.id;

Query này làm gì:

  • FROM enrollments — bắt đầu từ bảng liên kết sinh viên và khoá học.
  • JOIN students ON enrollments.student_id = students.id — nối thêm sinh viên để lấy tên của họ.
  • JOIN courses ON enrollments.course_id = courses.id — nối thêm khoá học để lấy tên khoá.

Kết quả sẽ như này:

name title
Otto Toán học
Anna Tiếng Anh

Lưu ý: nếu một sinh viên không học khoá nào thì sẽ không xuất hiện trong kết quả — vì JOIN mặc định là nghiêm ngặt (INNER JOIN). Sau này tụi mình sẽ học cách lấy cả những sinh viên như vậy bằng LEFT JOIN.

Nếu bạn chưa hiểu hết query này thì cũng đừng lo! Cứ từ từ, các bài sau sẽ giúp bạn hiểu rõ hơn!

Tại sao cần JOIN ngoài đời thực?

Bây giờ bạn đã hiểu cách kết nối các bảng, cùng bàn về thực tế nhé. Bạn từng thắc mắc web bán hàng hoạt động thế nào chưa? Ví dụ, khi bạn chọn điện thoại và thấy đánh giá của người dùng khác.

  1. Bảng products chứa thông tin sản phẩm.
  2. Bảng reviews chứa đánh giá của khách hàng.
  3. Bảng customers chứa thông tin về chính khách hàng đó

Để hiển thị đánh giá trên web, cần kết hợp các bảng products, reviewscustomers. Đó chính là JOIN ngoài đời thực.

Cần chú ý gì?

Trước khi đi sâu vào JOIN ở các bài sau, đây là vài điều bạn nên nhớ:

  1. Thứ tự trong JOIN rất quan trọng. Ví dụ, LEFT JOIN trả về dòng từ bảng bên trái, nên đổi thứ tự là kết quả cũng đổi.
  2. Làm việc với bảng nhỏ trước. Lúc mới học, tránh query hàng triệu dòng. Nhớ là, query đơn giản nhất cũng phải dễ hiểu.
  3. Tập thói quen nghĩ về liên kết. Khi bạn quen nhìn bảng như các phần của một cấu trúc lớn, làm việc với JOIN sẽ tự nhiên hơn nhiều.

Từ hôm nay, tụi mình sẽ bắt đầu trở thành chuyên gia SQL. Ở bài sau, bạn sẽ học cách dùng INNER JOIN để lấy dữ liệu từ hai bảng. Đây sẽ là bước tiến lớn trong hành trình học PostgreSQL của bạn đó.

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