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
studentschứa danh sách sinh viên. - Bảng
courseslưu danh sách các khoá học. - Bảng
enrollmentscho 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 JOINhoặcRIGHT 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
idtrongstudents— là mã định danh duy nhất của sinh viên. - Cột
idtrongcourses— là mã định danh duy nhất của khoá học. - Trong bảng
enrollments, các cộtstudent_idvàcourse_idtạ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
studentsvàenrollmentsquaid = student_id. - Kết nối
enrollmentsvàcoursesquacourse_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.
- Bảng
productschứa thông tin sản phẩm. - Bảng
reviewschứa đánh giá của khách hàng. - Bảng
customerschứ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, reviews và customers. Đó 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ớ:
- Thứ tự trong
JOINrất quan trọng. Ví dụ,LEFT JOINtrả về dòng từ bảng bên trái, nên đổi thứ tự là kết quả cũng đổi. - 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.
- 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
JOINsẽ 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 đó.
GO TO FULL VERSION