Hai bảng nối bằng mã
Bảng **TacGia** có `T01` → An và `T02` → Bình. Bảng **BanNhac** có K01 — “Mưa đầu mùa” — `T01`; K02 — “Ngày nắng” — `T02`; K03 — “Gió qua hiên” — `T01`. Các tên là dữ liệu hư cấu.
Muốn hiển thị tên bài cùng tên tác giả, phải ghép `BanNhac.MaTacGia` với `TacGia.MaTacGia`. Trường MaTacGia của BanNhac là khóa ngoài; trường cùng tên của TacGia là khóa chính.
Đọc phép INNER JOIN
```sql
SELECT BanNhac.TenBai,
TacGia.TenTacGia
FROM BanNhac
INNER JOIN TacGia
ON BanNhac.MaTacGia =
TacGia.MaTacGia
ORDER BY BanNhac.MaBai;
```
`ON` quy định cặp mã phải bằng nhau. K01 và K03 cùng ghép với T01 để được tên An; K02 ghép với T02 để được tên Bình. `SELECT` chỉ hiển thị hai tên, còn `ORDER BY` đưa kết quả theo mã bài K01, K02, K03. **INNER JOIN** chỉ giữ những hàng ghép được theo điều kiện; nếu có mã tác giả không khớp, hàng ấy không có trong kết quả này. `LEFT JOIN` có quy tắc giữ hàng bên trái khác, nên không thay thế hai phép ghép cho nhau trong mọi tình huống.
Bài luyện
Trong câu truy vấn, điều kiện nào quyết định bản nhạc ghép với tác giả nào?
Tên bài không được dùng trong ON.
Đó là điều kiện ON đã viết.
Số hàng không quyết định quan hệ.
ORDER BY chỉ sắp thứ tự kết quả.
Lời giải
Điều kiện ON so sánh BanNhac.MaTacGia với TacGia.MaTacGia. Khi hai mã bằng nhau, hai hàng tương ứng được ghép.
Bài luyện
Theo dữ liệu đã cho, K03 ghép với tác giả nào?
K03 không mang T02.
Vị trí hàng không cản ghép.
T01 trong TacGia ứng với An.
K03 chỉ có một MaTacGia T01.
Lời giải
K03 có MaTacGia là T01. Hàng TacGia có mã T01 ghi tên An, nên kết quả ghép của K03 là “Gió qua hiên” — An.
Bài luyện
Nếu có một hàng BanNhac mang mã tác giả T99 nhưng TacGia chưa có T99, INNER JOIN trên sẽ xử lí hàng ấy thế nào?
ON cần mã bằng nhau.
JOIN không tự chèn tác giả.
Không có hàng nào mã T99.
Không tìm thấy cặp mã bằng nhau.
Lời giải
INNER JOIN chỉ đưa ra hàng có cặp mã thỏa điều kiện ON. Khi TacGia không có T99, hàng BanNhac mang T99 không ghép được nên không xuất hiện; trong CSDL có thực thi khóa ngoài, bản ghi T99 thường bị chặn ngay từ lúc nhập.
Đang học