"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 ANhâ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| id | name |
|---|---|
| 1 | Nam |
| 2 | Linh |
| 3 | Hoa |
Và bảng:
orders| id | customer_id | total |
| 1 | 2 | 500000 |
| 2 | 1 | 250000 |
| 3 | 3 | 900000 |
Nhìn vào bảng:
ordersBạn chỉ thấy:
customer_id = 2Như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ả:
| Order | Tên | Tổng tiền |
| 1 | Linh | 500.000 |
| 2 | Nam | 250.000 |
| 3 | Hoa | 900.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ụ:
| id | customer_name |
| 1 | Nam |
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:
customersXong.
😎
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: 125Muố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
commentsRồ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. 🚀