Thứ Hai, 29 tháng 6, 2026

JOIN là gì? (Giải thích kiểu đời thường: Vì sao muốn biết tên khách hàng thì phải "đi hỏi" bảng khác?)

"Quán bún bà Tư có ngon không bạn?" hay "Bánh mì chú Sáu có ngon không anh?", đó là những câu hỏi quen thuộc nếu bạn chỉ "thấy" quán ăn và cần biết thông tin chi tiết. Nếu có một câu SQL khiến người mới mất ngủ nhiều nhất.

Có lẽ đó là:

JOIN

😅


Google giải thích:

JOIN dùng để kết hợp dữ liệu từ nhiều bảng dựa trên mối quan hệ giữa chúng.

...

Người mới:

"Dạ... em vẫn chưa hiểu lắm."

😭


Không sao.

Hôm nay chúng ta sẽ học JOIN bằng ví dụ đời thường.

Không công thức.

Không lý thuyết khô khan.

Không đau đầu.

😄


JOIN là gì?

JOIN là câu lệnh trong MySQL dùng để kết hợp dữ liệu từ hai hoặc nhiều bảng có liên quan với nhau.

Ví dụ:

  • Bảng khách hàng
  • Bảng đơn hàng

JOIN giúp lấy thông tin từ cả hai bảng trong cùng một câu lệnh SQL.


Ví dụ đời thường 🍜

Bạn tới bưu điện nhận hàng.

Nhân viên hỏi:

"Anh tên gì?"

Bạn trả lời:

Nguyễn Văn A

Nhân viên lại hỏi:

"Cho em xin CCCD."


Tại sao?

🤔


Vì:

Tên bạn nằm ở một nơi.

Thông tin đơn hàng nằm ở nơi khác.

Muốn biết:

Đơn hàng này có phải của anh không?

Họ phải đối chiếu hai nơi.

😎

Đó chính là JOIN.


Một website bán hàng

Có bảng:

customers
idname
1Nam
2Linh
3Hoa

Và bảng:

orders
idcustomer_idtotal
12500000
21250000
33900000

Nhìn vào bảng:

orders

Bạn chỉ thấy:

customer_id = 2

Nhưng...

Người dùng đâu biết:

2 là ai?

🤡


Muốn biết.

Phải sang bảng:

customers

để hỏi.

😄


JOIN xuất hiện

Ví dụ:

SELECT *

FROM orders

JOIN customers

ON orders.customer_id = customers.id;

MySQL sẽ hiểu:

"À.

Muốn biết người mua.

Để tôi sang bảng customers hỏi."

😎


Kết quả:

OrderTênTổng tiền
1Linh500.000
2Nam250.000
3Hoa900.000

Đẹp hơn rất nhiều.

😄


Vì sao không lưu luôn tên khách hàng?

Người mới thường hỏi:

"Sao không lưu luôn tên trong bảng orders?"

Ví dụ:

idcustomer_name
1Nam

Có vẻ đơn giản.

😄


Nhưng rồi.

Một ngày.

Nam đổi tên.

😅


Bạn phải sửa:

1 đơn hàng

10 đơn hàng

100 đơn hàng

5.000 đơn hàng

😭


Trong khi nếu dùng JOIN.

Bạn chỉ sửa:

1 dòng

ở bảng:

customers

Xong.

😎


Ví dụ đời thường 🍜

Hãy tưởng tượng.

Bạn có:

📒 Danh bạ lớp học.

Và:

📄 Danh sách điểm thi.


Danh sách điểm chỉ ghi:

SBD: 125

Muốn biết:

125 là ai?

Bạn mở danh bạ.

Đối chiếu.

Biết đó là:

Nguyễn Văn B

😎

JOIN chính là hành động:

Đối chiếu hai cuốn sổ.

INNER JOIN là gì?

Đây là JOIN phổ biến nhất.

Ví dụ:

SELECT *

FROM customers

INNER JOIN orders

ON customers.id = orders.customer_id;

Ý nghĩa:

👉 Chỉ lấy những khách hàng đã có đơn hàng.


Nếu:

Khách chưa từng mua.

Không xuất hiện.


LEFT JOIN là gì?

Ví dụ:

SELECT *

FROM customers

LEFT JOIN orders

ON customers.id = orders.customer_id;

Ý nghĩa:

👉 Hiển thị tất cả khách hàng.

Dù:

Có mua hàng.

Hay chưa.

😎


Một hiểu lầm rất phổ biến 🤡

Người mới nghĩ:

JOIN = Ghép hai bảng thành một.


Không.

JOIN không sửa database.


Nó chỉ:

Ghép dữ liệu lúc truy vấn.

Xong là hết.


Database vẫn giữ nguyên.

😄


InfinityFree Case 😅

Nhiều bạn làm website.

Có bảng:

users
posts
comments

Rồi viết:

SELECT *

FROM posts;

Website chỉ hiện:

user_id = 3

🤡


Người đọc:

"User số 3 là ai?"

😅


Chỉ cần JOIN:

Hiện:

Nguyễn Văn Nam

Website nhìn chuyên nghiệp hơn hẳn.

😎


Một sự thật thú vị 😄

Facebook.

Shopee.

Lazada.

WordPress.

Diễn đàn.

CRM.

ERP.

Hệ thống bệnh viện.

Ngân hàng.

...

Đều dùng JOIN mỗi ngày.


Nếu không có JOIN.

Bạn sẽ thấy:

User:

37

Product:

92

Category:

5

🤡


Thay vì:

Nguyễn Văn Nam

iPhone 16

Điện thoại

😄


Debug kiểu dev thật 😎

✅ 1. Kiểm tra khóa liên kết

Ví dụ:

customer_id

↓

customers.id

✅ 2. Kiểm tra dữ liệu có tồn tại không

Rất nhiều lỗi JOIN.

Không phải do JOIN.

Mà vì:

customer_id = 20

Nhưng bảng customers

không có ID 20.

😅


✅ 3. Đừng SELECT * mãi

Khi JOIN nhiều bảng.

Nên viết:

SELECT

customers.name,

orders.total

Dễ đọc hơn.

Nhanh hơn.

😎


Checklist chuẩn không cần chỉnh 😎

☑ JOIN dùng để lấy dữ liệu từ nhiều bảng

☑ Không lưu trùng dữ liệu

☑ INNER JOIN là phổ biến nhất

☑ LEFT JOIN giữ lại toàn bộ bảng bên trái

☑ Kiểm tra khóa liên kết

☑ Hạn chế SELECT *


FAQ nhanh

JOIN có làm thay đổi dữ liệu không?

→ Không.


JOIN có tạo bảng mới không?

→ Không.


Vì sao phải JOIN?

→ Vì dữ liệu thường nằm ở nhiều bảng khác nhau.


Website nhỏ có cần JOIN không?

→ Có.

Ngay cả website bán hàng nhỏ cũng sẽ dùng.


Bạn có thể cũng đang gặp 😭

👉 LIMIT trong MySQL là gì?

👉 Pagination hoạt động ra sao?

👉 AUTO_INCREMENT là gì?

👉 SQL Injection là gì?

👉 Prepared Statement là gì?

👉 Database chạy chậm dần?


Tổng kết

JOIN không phải là một "phép thuật" của MySQL.

Nó chỉ là một cách rất thông minh để hỏi thông tin từ nhiều nơi cùng lúc.

Nếu coi database là một văn phòng.

Thì mỗi bảng giống như một phòng ban:

👤 Phòng nhân sự.

📦 Phòng kho.

💰 Phòng kế toán.

📋 Phòng đơn hàng.

Mỗi phòng chỉ giữ phần việc của mình.

Muốn biết toàn bộ thông tin.

Bạn phải đi gõ cửa từng phòng.

Đó chính là JOIN.

😄

Và nếu bạn chỉ nhớ một điều từ bài này, hãy nhớ:

JOIN không làm dữ liệu nhiều lên.

JOIN chỉ giúp bạn ghép đúng những mảnh ghép vốn đã thuộc về nhau.

Cũng giống như cuộc sống vậy...

Có những người nhìn riêng lẻ thì rất bình thường.

Nhưng khi ghép đúng với nhau, họ tạo nên cả một câu chuyện. 🚀