Bài 30 – JOIN là gì? Ghép dữ liệu BĐS giữa nhiều bảng mà không nhân bản sai thuộc series Tin học BĐS. Bài tiếp tục theo nguyên tắc: hiểu cấu trúc và câu hỏi nghiệp vụ trước, sau đó mới dùng công cụ hoặc cú pháp.
Biên soạn: ThS. Nguyễn Mạnh Hùng
Đơn vị: GV. Khoa QLĐĐ&BĐS – ĐH Nông Lâm TP.HCM
Email: nguyenmanhhung@hcmuaf.edu.vn
Cập nhật 01/10/2026: Bài thuộc phần Cơ sở dữ liệu và SQL cho BĐS của series Tin học BĐS. Nội dung ưu tiên tiếng Việt thuần; chỉ giữ nguyên tên công cụ và cú pháp kỹ thuật bắt buộc. Ví dụ dùng dữ liệu bất động sản giả lập phục vụ giảng dạy.
Ranh giới chuyên đề: Bài thuộc phần Cơ sở dữ liệu và SQL cho BĐS. Trong thân bài ưu tiên dùng cơ sở dữ liệu, bảng, dòng, cột, khóa chính; chỉ giữ tên lệnh SQL vì là cú pháp bắt buộc.
1. JOIN dùng để kết hợp dữ liệu từ nhiều bảng dựa trên điều kiện liên kết, thường là khóa chính và khóa ngoại
JOIN dùng để kết hợp dữ liệu từ nhiều bảng dựa trên điều kiện liên kết, thường là khóa chính và khóa ngoại.
Trong thực hành, nội dung này phải được chuyển thành thiết kế có thể kiểm: khóa nào, quan hệ nào, dữ liệu nào bắt buộc, điều kiện nào hợp lệ và kết quả sau xử lý phải có đặc điểm gì. Nếu chỉ thao tác theo hướng dẫn mà không hiểu các điểm này, người học rất dễ tạo kết quả đúng hình thức nhưng sai dữ liệu.
2. INNER JOIN chỉ giữ những bản ghi có đối tác khớp ở cả hai bảng; LEFT JOIN giữ tất cả bản ghi bảng bên trái và bổ sung dữ liệu khớp nếu có
INNER JOIN chỉ giữ những bản ghi có đối tác khớp ở cả hai bảng; LEFT JOIN giữ tất cả bản ghi bảng bên trái và bổ sung dữ liệu khớp nếu có.
Trong thực hành, nội dung này phải được chuyển thành thiết kế có thể kiểm: khóa nào, quan hệ nào, dữ liệu nào bắt buộc, điều kiện nào hợp lệ và kết quả sau xử lý phải có đặc điểm gì. Nếu chỉ thao tác theo hướng dẫn mà không hiểu các điểm này, người học rất dễ tạo kết quả đúng hình thức nhưng sai dữ liệu.
3. Trong BĐS, có thể ghép Nguồn_hàng với Người_dùng theo mã người phụ trách hoặc ghép Tài_sản với Phường theo mã phường
Trong BĐS, có thể ghép Nguồn_hàng với Người_dùng theo mã người phụ trách hoặc ghép Tài_sản với Phường theo mã phường.
Trong thực hành, nội dung này phải được chuyển thành thiết kế có thể kiểm: khóa nào, quan hệ nào, dữ liệu nào bắt buộc, điều kiện nào hợp lệ và kết quả sau xử lý phải có đặc điểm gì. Nếu chỉ thao tác theo hướng dẫn mà không hiểu các điểm này, người học rất dễ tạo kết quả đúng hình thức nhưng sai dữ liệu.
| Câu hỏi kiểm | Mục đích |
|---|---|
| Mỗi dòng đại diện gì? | Không trộn đối tượng |
| Khóa nào định danh? | Chống trùng |
| Quan hệ nào? | Tránh nhân dòng |
| Dữ liệu rỗng xử lý sao? | Không hiểu sai |
| Sau xử lý kiểm gì? | Có bằng chứng |
4. Nguy cơ lớn nhất là nhân bản dòng khi bảng được ghép có nhiều bản ghi cùng khóa mà người viết truy vấn tưởng là duy nhất
Nguy cơ lớn nhất là nhân bản dòng khi bảng được ghép có nhiều bản ghi cùng khóa mà người viết truy vấn tưởng là duy nhất.
Trong thực hành, nội dung này phải được chuyển thành thiết kế có thể kiểm: khóa nào, quan hệ nào, dữ liệu nào bắt buộc, điều kiện nào hợp lệ và kết quả sau xử lý phải có đặc điểm gì. Nếu chỉ thao tác theo hướng dẫn mà không hiểu các điểm này, người học rất dễ tạo kết quả đúng hình thức nhưng sai dữ liệu.
5. Trước JOIN phải hiểu quan hệ: một-một, một-nhiều hay nhiều-nhiều; nếu không, số dòng sau ghép có thể tăng bất ngờ
Trước JOIN phải hiểu quan hệ: một-một, một-nhiều hay nhiều-nhiều; nếu không, số dòng sau ghép có thể tăng bất ngờ.
Trong thực hành, nội dung này phải được chuyển thành thiết kế có thể kiểm: khóa nào, quan hệ nào, dữ liệu nào bắt buộc, điều kiện nào hợp lệ và kết quả sau xử lý phải có đặc điểm gì. Nếu chỉ thao tác theo hướng dẫn mà không hiểu các điểm này, người học rất dễ tạo kết quả đúng hình thức nhưng sai dữ liệu.
6. Không nên ghép theo tên địa bàn tự do nếu có mã chuẩn; khác dấu hoặc khác cách viết có thể làm mất bản ghi khớp
Không nên ghép theo tên địa bàn tự do nếu có mã chuẩn; khác dấu hoặc khác cách viết có thể làm mất bản ghi khớp.
Trong thực hành, nội dung này phải được chuyển thành thiết kế có thể kiểm: khóa nào, quan hệ nào, dữ liệu nào bắt buộc, điều kiện nào hợp lệ và kết quả sau xử lý phải có đặc điểm gì. Nếu chỉ thao tác theo hướng dẫn mà không hiểu các điểm này, người học rất dễ tạo kết quả đúng hình thức nhưng sai dữ liệu.
| Câu hỏi kiểm | Mục đích |
|---|---|
| Mỗi dòng đại diện gì? | Không trộn đối tượng |
| Khóa nào định danh? | Chống trùng |
| Quan hệ nào? | Tránh nhân dòng |
| Dữ liệu rỗng xử lý sao? | Không hiểu sai |
| Sau xử lý kiểm gì? | Có bằng chứng |
7. Sau JOIN cần kiểm số dòng, số khóa duy nhất, số bản ghi không khớp và một mẫu kết quả ngẫu nhiên
Sau JOIN cần kiểm số dòng, số khóa duy nhất, số bản ghi không khớp và một mẫu kết quả ngẫu nhiên.
Trong thực hành, nội dung này phải được chuyển thành thiết kế có thể kiểm: khóa nào, quan hệ nào, dữ liệu nào bắt buộc, điều kiện nào hợp lệ và kết quả sau xử lý phải có đặc điểm gì. Nếu chỉ thao tác theo hướng dẫn mà không hiểu các điểm này, người học rất dễ tạo kết quả đúng hình thức nhưng sai dữ liệu.
8. Khi cần lấy một bản ghi mới nhất từ bảng lịch sử trước khi JOIN, phải xác định quy tắc chọn rõ chứ không ghép toàn bộ lịch sử rồi hy vọng kết quả đúng
Khi cần lấy một bản ghi mới nhất từ bảng lịch sử trước khi JOIN, phải xác định quy tắc chọn rõ chứ không ghép toàn bộ lịch sử rồi hy vọng kết quả đúng.
Trong thực hành, nội dung này phải được chuyển thành thiết kế có thể kiểm: khóa nào, quan hệ nào, dữ liệu nào bắt buộc, điều kiện nào hợp lệ và kết quả sau xử lý phải có đặc điểm gì. Nếu chỉ thao tác theo hướng dẫn mà không hiểu các điểm này, người học rất dễ tạo kết quả đúng hình thức nhưng sai dữ liệu.
Bảng trọng tâm
| Kiểu ghép | Kết quả | Khi dùng |
|---|---|---|
| INNER JOIN | Chỉ bản ghi khớp | Cần dữ liệu có đối tác |
| LEFT JOIN | Giữ toàn bộ bên trái | Kiểm thiếu danh mục |
| Một-nhiều | Có thể tăng dòng | Phải hiểu quan hệ |
Ví dụ JOIN cơ bản
SELECT t.ma_tai_san, t.dien_tich, p.ten_phuong FROM tai_san t LEFT JOIN phuong p ON t.ma_phuong = p.ma_phuong;Nếu bảng phường có mỗi mã một dòng, số dòng thường không tăng. Nếu bảng bên phải có khóa trùng, kết quả có thể bị nhân bản.
Tư duy quan hệ thay cho tư duy một bảng duy nhất
Cơ sở dữ liệu quan hệ giúp mỗi loại đối tượng được lưu ở nơi phù hợp. Tên phường không cần lặp lại trong hàng trăm nghìn dòng; chỉ cần mã phường ở bảng nghiệp vụ và tên phường ở bảng danh mục. Khi cần báo cáo, SQL ghép các bảng lại theo khóa.
| Nguyên tắc | Ý nghĩa | Rủi ro nếu bỏ |
|---|---|---|
| Khóa chính | Định danh duy nhất | Trùng bản ghi |
| Khóa ngoại | Liên kết bảng | Mất quan hệ |
| Kiểu dữ liệu | Kiểm cấu trúc | Sai so sánh |
| Ràng buộc | Ngăn lỗi | Dữ liệu không hợp lệ |
| Truy vấn | Lấy đúng phần cần | Sao chép thủ công |
SQL là ngôn ngữ hỏi dữ liệu, không thay thế hiểu nghiệp vụ
Một truy vấn có thể chạy đúng cú pháp nhưng sai câu hỏi. Ví dụ đếm dòng không đồng nghĩa đếm tài sản nếu một tài sản có nhiều dòng khảo sát. Trước khi viết SQL phải xác định mỗi dòng trong bảng đại diện cho điều gì.
Kiểm số dòng trước và sau
Khi lọc, nhóm hoặc ghép bảng, số dòng thay đổi theo quy tắc. Việc ghi số dòng trước/sau và đếm khóa duy nhất là cách đơn giản để phát hiện nhiều lỗi logic.
Nhân bản sau JOIN là tín hiệu cần điều tra
Nếu dự kiến mỗi tài sản chỉ một dòng mà sau JOIN số dòng tăng, hãy dừng và kiểm khóa bên phải. Đừng dùng DISTINCT để che vấn đề trước khi hiểu nguyên nhân.
Tình huống giả lập phục vụ giảng dạy
Bảng Tài_sản có 10.000 dòng; bảng Phường có mã phường duy nhất; bảng Khảo_sát có nhiều lần khảo sát mỗi tài sản. Hãy giải thích vì sao JOIN với Phường không làm tăng dòng nhưng JOIN trực tiếp với Khảo_sát có thể làm tăng.
Sinh viên phải giải thích cả cấu trúc dữ liệu, thao tác và kiểm tra sau thao tác. Không chỉ nộp ảnh kết quả hoặc câu lệnh chạy được; phải chỉ ra vì sao kết quả đúng.
Quy trình thực hành gợi ý
- Xác định câu hỏi nghiệp vụ trước khi mở công cụ.
- Vẽ sơ đồ dữ liệu hoặc quan hệ ở mức đơn giản.
- Xác định khóa chính, khóa liên kết và trường bắt buộc.
- Tạo một bộ dữ liệu nhỏ để kiểm thử.
- Thực hiện mô hình/truy vấn trên bộ nhỏ.
- Chèn trường hợp trùng, thiếu và không khớp.
- Đối chiếu số dòng, số khóa và kết quả mẫu.
- Ghi quy tắc, nguồn và cách làm mới/bàn giao.
Tiêu chí chấm bài thực hành
| Tiêu chí | Tỷ trọng gợi ý | Đạt khi |
|---|---|---|
| Mô hình đúng | 30% | Đúng đối tượng/quan hệ |
| Kỹ thuật đúng | 25% | Truy vấn/công cụ chạy đúng |
| Kiểm soát lỗi | 20% | Có kiểm khóa/số dòng |
| Diễn giải | 15% | Giải thích đúng nghiệp vụ |
| Bàn giao | 10% | Người khác tái lập được |
Bài tập mở rộng
- Tạo bộ dữ liệu BĐS giả lập có ít nhất 3 bảng.
- Xác định khóa chính và khóa ngoại.
- Cố ý tạo 5 lỗi khóa hoặc quan hệ.
- Viết truy vấn hoặc thiết kế mô hình để xử lý câu hỏi của bài.
- Ghi số dòng trước và sau từng bước.
- Tạo bảng kiểm bản ghi không khớp.
- Viết giải thích tối đa một trang cho người nhận.
- Cho nhóm khác kiểm và phát hiện ít nhất một điểm cần cải tiến.
Những lỗi thường gặp
- Ép mọi dữ liệu vào một bảng lớn.
- Dùng tên thay cho mã định danh.
- Không kiểm khóa trùng.
- Tạo quan hệ mà chưa hiểu một-nhiều hay nhiều-nhiều.
- Làm mới mà không kiểm kết quả.
- Chọn công cụ phức tạp không cần thiết.
- Dùng SELECT * cho mọi báo cáo.
- Dùng GROUP BY trên dữ liệu trùng mà không biết.
- JOIN rồi dùng DISTINCT để che nhân bản.
- Không ghi tài liệu mô hình và quy tắc.
Liên hệ công việc BĐS
Khi hệ thống BĐS phát triển, cùng một tài sản có thể liên quan tới nhiều lần khảo sát, nhiều nguồn hàng, nhiều khách và nhiều giao dịch. Nếu cấu trúc dữ liệu không tách đúng đối tượng, báo cáo rất dễ đếm sai hoặc ghi đè lịch sử. Đây là lý do phần cơ sở dữ liệu không chỉ là học câu lệnh SQL mà là học cách tổ chức thông tin nghề nghiệp.
Tiêu chí tự đánh giá
| Tiêu chí | Đạt khi |
|---|---|
| Đúng đối tượng | Mỗi bảng/dòng có nghĩa rõ |
| Đúng khóa | Định danh và liên kết ổn định |
| Đúng truy vấn | Trả lời đúng câu hỏi |
| Có kiểm soát | Kiểm số dòng/khóa/lỗi |
| Bàn giao được | Có sơ đồ và mô tả |
Câu hỏi tự kiểm tra
- Mỗi dòng trong bảng này đại diện điều gì?
- Khóa có thật sự duy nhất không?
- Quan hệ có làm nhân bản dòng không?
- Truy vấn đang đếm bản ghi hay đếm tài sản?
- Kết quả có phụ thuộc dữ liệu trùng không?
- Người khác có thể hiểu mô hình mà không hỏi tôi không?
Ghi nhớ trong 30 giây
- JOIN dùng để kết hợp dữ liệu từ nhiều bảng dựa trên điều kiện liên kết, thường là khóa chính và khóa ngoại.
- Trong BĐS, có thể ghép Nguồn_hàng với Người_dùng theo mã người phụ trách hoặc ghép Tài_sản với Phường theo mã phường.
- Trước JOIN phải hiểu quan hệ: một-một, một-nhiều hay nhiều-nhiều; nếu không, số dòng sau ghép có thể tăng bất ngờ.
- Sau JOIN cần kiểm số dòng, số khóa duy nhất, số bản ghi không khớp và một mẫu kết quả ngẫu nhiên.
- Khi cần lấy một bản ghi mới nhất từ bảng lịch sử trước khi JOIN, phải xác định quy tắc chọn rõ chứ không ghép toàn bộ lịch sử rồi hy vọng kết quả đúng.
Nguồn tham khảo
- Đề cương học phần 612421 – Tin học ứng dụng trong bất động sản, Trường Đại học Nông Lâm TP.HCM.
- Kế hoạch 96 chủ đề website – series Tin học BĐS trong hệ thống BDSNL.
- Microsoft Support – tài liệu chính thức về Power Query, Power Pivot và mô hình dữ liệu.
- PostgreSQL Documentation – tài liệu chính thức về cơ sở dữ liệu quan hệ và cú pháp SQL.
- Nguyên tắc quản trị dữ liệu: khóa định danh, quan hệ bảng, kiểm soát chất lượng, khả năng truy vết và khả năng tái lập.
Bài tiếp theo: “NULL trong database khác ô trống Excel như thế nào?”.
Gợi ý kiểm tra chéo trên lớp
Một nhóm thiết kế mô hình hoặc truy vấn, nhóm khác nhận dữ liệu và chỉ được đọc tài liệu bàn giao để chạy lại. Nếu nhóm kiểm không xác định được khóa, quan hệ hoặc lý do số dòng thay đổi, phần thiết kế cần được sửa.
Sau kiểm chéo, nhóm tạo nhật ký ngắn gồm vấn đề, nguyên nhân, ảnh hưởng và cách sửa. Cách học này giúp sinh viên hình thành thói quen coi dữ liệu và truy vấn là sản phẩm phải bàn giao, không phải bài làm cá nhân.
Gợi ý kiểm tra chéo trên lớp
Một nhóm thiết kế mô hình hoặc truy vấn, nhóm khác nhận dữ liệu và chỉ được đọc tài liệu bàn giao để chạy lại. Nếu nhóm kiểm không xác định được khóa, quan hệ hoặc lý do số dòng thay đổi, phần thiết kế cần được sửa.
Sau kiểm chéo, nhóm tạo nhật ký ngắn gồm vấn đề, nguyên nhân, ảnh hưởng và cách sửa. Cách học này giúp sinh viên hình thành thói quen coi dữ liệu và truy vấn là sản phẩm phải bàn giao, không phải bài làm cá nhân.
Gợi ý kiểm tra chéo trên lớp
Một nhóm thiết kế mô hình hoặc truy vấn, nhóm khác nhận dữ liệu và chỉ được đọc tài liệu bàn giao để chạy lại. Nếu nhóm kiểm không xác định được khóa, quan hệ hoặc lý do số dòng thay đổi, phần thiết kế cần được sửa.
Sau kiểm chéo, nhóm tạo nhật ký ngắn gồm vấn đề, nguyên nhân, ảnh hưởng và cách sửa. Cách học này giúp sinh viên hình thành thói quen coi dữ liệu và truy vấn là sản phẩm phải bàn giao, không phải bài làm cá nhân.
Gợi ý kiểm tra chéo trên lớp
Một nhóm thiết kế mô hình hoặc truy vấn, nhóm khác nhận dữ liệu và chỉ được đọc tài liệu bàn giao để chạy lại. Nếu nhóm kiểm không xác định được khóa, quan hệ hoặc lý do số dòng thay đổi, phần thiết kế cần được sửa.
Sau kiểm chéo, nhóm tạo nhật ký ngắn gồm vấn đề, nguyên nhân, ảnh hưởng và cách sửa. Cách học này giúp sinh viên hình thành thói quen coi dữ liệu và truy vấn là sản phẩm phải bàn giao, không phải bài làm cá nhân.
Gợi ý kiểm tra chéo trên lớp
Một nhóm thiết kế mô hình hoặc truy vấn, nhóm khác nhận dữ liệu và chỉ được đọc tài liệu bàn giao để chạy lại. Nếu nhóm kiểm không xác định được khóa, quan hệ hoặc lý do số dòng thay đổi, phần thiết kế cần được sửa.
Sau kiểm chéo, nhóm tạo nhật ký ngắn gồm vấn đề, nguyên nhân, ảnh hưởng và cách sửa. Cách học này giúp sinh viên hình thành thói quen coi dữ liệu và truy vấn là sản phẩm phải bàn giao, không phải bài làm cá nhân.