CodeGym /Các khóa học /SQL SELF /Cơ bản về INNER JOIN

Cơ bản về INNER JOIN

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

Ở bài trước tụi mình đã bàn về các loại JOIN trong SQL. Hôm nay tụi mình sẽ đi sâu hơn vào INNER JOIN nha.

INNER JOIN là kiểu kết hợp dữ liệu trong database quan hệ, cho phép lấy các dòng từ hai bảng và chỉ trả về những dòng nào "khớp" theo điều kiện mà bạn chỉ định. Nói cách khác, INNER JOIN chỉ trả về phần giao nhau của hai bảng, bỏ qua tất cả những gì không liên quan.

Giả sử bạn có hai cái hộp. Một hộp chứa thẻ sinh viên, hộp còn lại chứa thẻ các khoá học mà sinh viên đã đăng ký. Bạn muốn biết sinh viên nào đăng ký khoá nào. Nếu không có sự trùng khớp (ví dụ sinh viên chưa đăng ký khoá nào), thì dữ liệu đó mình chưa quan tâm. Đây là tình huống cực kỳ hợp với INNER JOIN.

Cú pháp INNER JOIN

Cú pháp khá là dễ hiểu — bạn chỉ định hai bảng muốn kết hợp, rồi đặt điều kiện kết hợp bằng từ khoá ON.

SELECT cột
FROM bảng1 INNER JOIN bảng2
ON bảng1.trường = bảng2.trường;
  • bảng1bảng2 — là hai bảng bạn muốn kết hợp.
  • trường — là các cột dùng để so khớp.
  • Điều kiện sau ON chỉ ra quy tắc so khớp dòng giữa hai bảng.

Ví dụ sử dụng INNER JOIN

Cho các ví dụ tiếp theo, tụi mình sẽ làm việc với hai bảng:

Bảng students — dữ liệu về sinh viên

student_id name age
1 Otto 20
2 Anna 22
3 Peter 19
4 Dia 21

Bảng enrollments — dữ liệu về đăng ký khoá học

enrollment_id student_id course_id
101 1 501
102 2 502
103 2 503
104 3 504

Lưu ý, sinh viên Dia (với student_id = 4) chưa đăng ký khoá nào hết nha.

Ví dụ 1: Lấy thông tin sinh viên và khoá học của họ

Tụi mình muốn biết sinh viên nào đã đăng ký khoá học nào. Đây là ví dụ điển hình cho INNER JOIN. Chỉ quan tâm đến những dòng có dữ liệu trùng giữa bảng studentsenrollments dựa trên student_id.

SELECT students.name, enrollments.course_id
FROM students INNER JOIN enrollments
ON students.student_id = enrollments.student_id;

Kết quả:

name course_id
Otto 501
Anna 502
Anna 503
Peter 504

Thấy gì không? INNER JOIN chỉ trả về những sinh viên đã đăng ký khoá học. Bạn Dia chưa đăng ký gì nên không có trong kết quả.

Ví dụ 2: Lấy đơn hàng và khách hàng

Giờ thử ví dụ khác nha. Giả sử có hai bảng orders (đơn hàng) và customers (khách hàng). Mình muốn lấy danh sách tất cả đơn hàng kèm tên khách hàng.

Bảng orders

order_id customer_id amount
1 101 500
2 102 300
3 103 700

Bảng customers

customer_id name
101 Otto
102 Anna
104 Peter

Nhiệm vụ: mình cần kết hợp orderscustomers theo customer_id, chỉ trả về những đơn hàng có khách hàng tương ứng.

SELECT orders.order_id, customers.name, orders.amount
FROM orders INNER JOIN customers
ON orders.customer_id = customers.customer_id;

Kết quả:

order_id name amount
1 Otto 500
2 Anna 300

Lưu ý là đơn hàng với order_id = 3 không xuất hiện trong kết quả, vì khách hàng với customer_id = 103 không tồn tại trong bảng customers.

Làm sao INNER JOIN giúp kết nối bảng (và có thể gặp lỗi gì)

INNER JOIN là công cụ cơ bản mà bạn sẽ dùng gần như trong mọi project liên quan đến database quan hệ. Nó giống như cái mỏ lết trong bộ đồ nghề: bạn có thể thử không dùng, nhưng sẽ khó mà làm được việc. Ví dụ:

  • Khi tạo báo cáo cần kết hợp dữ liệu từ nhiều bảng.
  • Khi làm phân tích, cần nối dữ liệu fact với dimension (ví dụ: bán hàng và khách hàng).
  • Khi tích hợp dữ liệu từ hệ thống bên ngoài.

Lỗi phổ biến nhất của newbie là quên ON hoặc ghi sai điều kiện kết hợp. Nếu bạn không đặt đúng điều kiện, thay vì kết quả mong muốn bạn sẽ nhận được tích đề các của hai bảng — có thể ra hàng ngàn, hàng triệu dòng vô nghĩa luôn.

Ví dụ lỗi:

Trong ví dụ này không có điều kiện kết hợp, nên câu truy vấn sẽ tạo ra mọi tổ hợp có thể giữa hai bảng (và chắc chắn không phải cái bạn muốn đâu):

SELECT students.name, enrollments.course_id
FROM students, enrollments;  -- LỖI: không có điều kiện kết hợp!

Kết quả sẽ là một mớ hỗn độn: mỗi dòng của students sẽ kết hợp với mỗi dòng của enrollments.

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