Tên nhạc sĩ ở bảng nào?
Trong mô hình đang dùng, `bannhac` có `idBannhac`, `tenBannhac`, `idNhacsi`; **không có cột `tenNhacsi`**. Tên người nằm ở `nhacsi(idNhacsi,tenNhacsi)`. Muốn hiện tên bài cạnh tên nhạc sĩ, cần ghép mỗi hàng bản nhạc với hàng nhạc sĩ **có cùng mã**. Đó là ý nghĩa của điều kiện `bannhac.idNhacsi = nhacsi.idNhacsi`.
Ví dụ dữ liệu giả: bài mã 1 “Mưa đầu mùa” mang mã nhạc sĩ 1; bảng `nhacsi` cho biết mã 1 là Mai An. Bài mã 2 cũng tên “Mưa đầu mùa” nhưng mang mã 2, ứng với Hà Vy. Ghép theo **tên bài** sẽ nhầm hai người; ghép theo mã nhạc sĩ thì mỗi bài tìm đúng hàng cha.
Chạy một câu INNER JOIN
Trong thẻ Query của CSDL thực hành, chạy:
```sql
SELECT b.idBannhac, b.tenBannhac, n.tenNhacsi
FROM bannhac AS b
INNER JOIN nhacsi AS n
ON b.idNhacsi = n.idNhacsi
ORDER BY b.idBannhac;
```
`AS b` và `AS n` là tên ngắn tạm thời cho hai bảng trong câu truy vấn. `ON` ghi điều kiện nối; `ORDER BY` sắp kết quả. Với ba bài trên máy thử, câu này trả ba hàng: mã1/Mưa đầu mùa/Mai An, mã2/Mưa đầu mùa/Hà Vy, mã6/Ngày nắng/Mai An. Hai bài trùng tên vẫn là hai hàng khác mã. `INNER JOIN` chỉ cho các cặp khớp điều kiện; trong CSDL bài tập, khóa ngoại không cho lưu bài trỏ tới nhạc sĩ không có thật. Nếu kết quả ít hơn dự kiến, kiểm mã, dữ liệu và điều kiện `ON`, không đoán từ giao diện.
Bài luyện
Muốn hiện tenBannhac cùng tenNhacsi, cần nối theo điều kiện nào?
Mã bài không phải mã nhạc sĩ.
Khóa ngoại của bài khớp khóa chính nhạc sĩ.
Hai cột tên mang ý nghĩa khác nhau.
Một vế số, một vế tên; không là quan hệ đã khai báo.
Lời giải
Dùng mã nhạc sĩ ở bannhac để ghép với idNhacsi của nhacsi.
Bài luyện
Hai hàng có cùng tenBannhac = “Mưa đầu mùa”, nhưng idNhacsi khác nhau. JOIN đúng sẽ cho gì?
JOIN không tự gộp theo tên.
Mỗi mã nhạc sĩ đối chiếu hàng cha của nó.
Mã khác nhau có thể dẫn tới người khác nhau.
UNIQUE cặp cho phép cùng tên khác nhạc sĩ.
Lời giải
Điều kiện nối dùng idNhacsi, nên hai bài cùng tên vẫn có thể cho hai hàng với hai nhạc sĩ khác nhau.
Bài luyện
Trong `FROM bannhac AS b INNER JOIN nhacsi AS n`, `b` và `n` dùng để làm gì?
Alias không tạo bảng.
Tên ngắn giúp viết rõ b.idNhacsi và n.idNhacsi.
Alias không sửa dữ liệu.
Số hàng phụ thuộc dữ liệu/điều kiện.
Lời giải
`b` và `n` là bí danh của bannhac và nhacsi trong câu SELECT; dữ liệu bảng không đổi.
Đang học