Giải Tin Học trang 112
Lời giải chi tiết SGK Lớp 11 · Môn Tin Há»c · Trang 112–113
Nguon: Tin Hoc 11 - Ket Noi Tri Thuc Voi Cuoc Song (trang 112 – 113)
🔍 Kiến thức cần nhớ
Bài này thực hành truy vấn dữ liệu từ nhiều bảng bằng câu lệnh SQL với mệnh đề INNER JOIN.
Cơ sở dữ liệu mymusic gồm các bảng (liên kết qua khoá ngoài):
- nhacsi(idNhacsi, tenNhacsi)
- casi(idCasi, tenCasi)
- theloai(idTheloai, tenTheloai)
- bannhac(idBannhac, tenBannhac, idNhacsi, idTheloai)
- banthuam(idBanthuam, idBannhac, idCasi)
Cú pháp kết nối hai bảng:
SELECT danh_sách_các_trường
FROM bảng_A
INNER JOIN bảng_B
ON bảng_A.khoá = bảng_B.khoá
[WHERE điều_kiện]
[ORDER BY trường] ;
Kết nối nhiều hơn hai bảng thì lặp lại mệnh đề INNER JOIN ... ON ...:
SELECT danh_sách_trường
FROM bảng_A
INNER JOIN bảng_B ON bảng_A.trường = bảng_B.trường
INNER JOIN bảng_C ON bảng_X.trường = bảng_C.trường
[WHERE ...]
[ORDER BY ...] ;
💡 Mẹo nhớ: Cứ thêm một bảng thì thêm một dòngINNER JOIN ... ON .... Điều kiệnONluôn nối khoá chính của bảng này với khoá ngoài tương ứng ở bảng kia.
⚙️ Bài tập
Câu 1 (Hãy thực hành – ý 1)
Đề bài: Lập danh sách bao gồm idBannhac, tenBannhac, tenNhacsi từ tất cả các bản nhạc có trong bảng bannhac.
Cách 1 — Dùng INNER JOIN
SELECT bannhac.idBannhac, bannhac.tenBannhac, nhacsi.tenNhacsi
FROM bannhac
INNER JOIN nhacsi
ON bannhac.idNhacsi = nhacsi.idNhacsi ;
Giải thích: trường tenNhacsi không nằm trong bảng bannhac mà nằm ở bảng nhacsi, nên phải nối hai bảng theo cặp khoá idNhacsi.
Cách 2 — Dùng bí danh (alias) cho gọn
SELECT b.idBannhac, b.tenBannhac, n.tenNhacsi
FROM bannhac AS b
INNER JOIN nhacsi AS n ON b.idNhacsi = n.idNhacsi ;
Đặt bí danh b, n giúp câu lệnh ngắn, dễ đọc khi có nhiều bảng.
Câu 2 (Hãy thực hành – ý 2)
Đề bài: Lập danh sách bao gồm idBannhac, tenBannhac từ tất cả các bản nhạc của nhạc sĩ Đỗ Nhuận có trong bảng bannhac.
Cách 1 — JOIN kết hợp WHERE
SELECT bannhac.idBannhac, bannhac.tenBannhac
FROM bannhac
INNER JOIN nhacsi
ON bannhac.idNhacsi = nhacsi.idNhacsi
WHERE nhacsi.tenNhacsi = 'Đỗ Nhuận' ;
Vẫn cần JOIN sang bảng nhacsi để biết được tên nhạc sĩ, sau đó lọc bằng WHERE.
Cách 2 — Dùng truy vấn con (subquery)
SELECT idBannhac, tenBannhac
FROM bannhac
WHERE idNhacsi = (
SELECT idNhacsi FROM nhacsi WHERE tenNhacsi = 'Đỗ Nhuận'
) ;
Cách này không cần JOIN, lấy trực tiếp idNhacsi của Đỗ Nhuận rồi lọc.
⚠️ Lưu ý thi: Khi điều kiện liên quan đến trường tên (ở bảng khác) nhưng kết quả chỉ cần lấy trường ở bảng chính, vẫn phải nối bảng hoặc dùng subquery. Đừng quên dấu nháy đơn cho chuỗi: 'Đỗ Nhuận'.
Câu 3 (Nhiệm vụ 2)
Đề bài: Lập danh sách các bản thu âm với đủ các thông tin idBanthuam, tenBannhac, tenCasi.
Cách 1 — JOIN ba bảng
Bảng banthuam chỉ chứa idBannhac và idCasi (dạng số), nên cần nối thêm bannhac để lấy tên bản nhạc và casi để lấy tên ca sĩ.
SELECT banthuam.idBanthuam, bannhac.tenBannhac, casi.tenCasi
FROM banthuam
INNER JOIN bannhac
ON banthuam.idBannhac = bannhac.idBannhac
INNER JOIN casi
ON banthuam.idCasi = casi.idCasi ;
Cách 2 — Dùng bí danh và sắp xếp kết quả
SELECT bt.idBanthuam, b.tenBannhac, c.tenCasi
FROM banthuam AS bt
INNER JOIN bannhac AS b ON bt.idBannhac = b.idBannhac
INNER JOIN casi AS c ON bt.idCasi = c.idCasi
ORDER BY bt.idBanthuam ;
Thêm ORDER BY để danh sách hiển thị theo thứ tự mã bản thu âm cho dễ tra cứu.
Câu 4 (Nhiệm vụ 3)
Đề bài: Qua giao diện Hình 23.4, tìm hiểu một chức năng của ứng dụng Quản lý dữ liệu âm nhạc, so sánh với những kiến thức vừa học và cho nhận xét.
Trả lời:
Chức năng tiêu biểu là Quản lý danh sách các bản thu âm. Nhận xét so sánh:
- Giao diện hiển thị bảng thu âm với các cột Mã, Bản nhạc, Ca sĩ ở dạng tường minh (ghi rõ tên bản nhạc, tên nhạc sĩ, tên ca sĩ), trong khi trong CSDL bảng
banthuamchỉ lưu các mã số (idBannhac, idCasi). Như vậy ứng dụng đã thay người dùng thực hiện chính các câu lệnhINNER JOINở Nhiệm vụ 2 để chuyển mã thành tên. - Khi nhập dữ liệu, ô Bản nhạc và Ca sĩ là hộp chọn (combo box) chỉ liệt kê những tên đã có trong CSDL, người dùng không gõ tay. Điều này đúng với nguyên tắc của khoá ngoài: chỉ được tham chiếu tới giá trị đã tồn tại ở bảng cha.
💡 Mẹo nhớ: Ứng dụng = "lớp áo" thân thiện che đi cấu trúc bảng và các câu lệnh SQL phức tạp bên dưới.
Câu 5 (Theo các em – 3 câu hỏi trang 112)
Đề bài:
a) Người sử dụng có cần biết, nhớ cấu trúc của bảng trong CSDL không?
b) Giao diện trên có dễ hiểu, dễ sử dụng không?
c) Hình thức nhập dữ liệu như vậy có hỗ trợ tính nhất quán dữ liệu không?
Trả lời:
a) Không. Người dùng chỉ thao tác qua giao diện trực quan (chọn tên bản nhạc, tên ca sĩ, bấm Nhập/Tìm/Xóa). Việc tách bảng, dùng khoá ngoài và viết câu lệnh JOIN do người lập trình lo, người dùng cuối không cần biết.
b) Có. Giao diện trình bày dạng bảng rõ ràng, dùng hộp chọn và các nút chức năng quen thuộc nên dễ hiểu, dễ dùng cả với người không biết về CSDL.
c) Có. Vì tên bản nhạc và tên ca sĩ chỉ được chọn từ danh sách có sẵn (những giá trị đã tồn tại trong CSDL) chứ không nhập tự do, nên tránh được sai chính tả, trùng lặp, dữ liệu "mồ côi" — đảm bảo tính toàn vẹn tham chiếu và tính nhất quán của dữ liệu.
⚠️ Lưu ý thi: Ý nghĩa của việc nhập bằng hộp chọn = ràng buộc khoá ngoài, một câu hỏi lý thuyết hay gặp.
⚙️ LUYỆN TẬP
Lưu ý: trong các bảng, tenTacgia chính là tenNhacsi (tác giả bản nhạc), lấy từ bảng nhacsi.
Câu 1
Đề bài: Lấy danh sách các bản thu âm với đầy đủ các thông tin idBanthuam, tenBannhac, tenTheloai, tenNhacsi, tenCasi.
Cách 1 — JOIN năm bảng
SELECT banthuam.idBanthuam,
bannhac.tenBannhac,
theloai.tenTheloai,
nhacsi.tenNhacsi,
casi.tenCasi
FROM banthuam
INNER JOIN bannhac ON banthuam.idBannhac = bannhac.idBannhac
INNER JOIN theloai ON bannhac.idTheloai = theloai.idTheloai
INNER JOIN nhacsi ON bannhac.idNhacsi = nhacsi.idNhacsi
INNER JOIN casi ON banthuam.idCasi = casi.idCasi ;
Phân tích đường liên kết:
banthuam → bannhacqua idBannhac (để lấy tên bản nhạc).bannhac → theloaiqua idTheloai (lấy thể loại).bannhac → nhacsiqua idNhacsi (lấy tác giả).banthuam → casiqua idCasi (lấy ca sĩ thể hiện).
Cách 2 — Dùng bí danh
SELECT bt.idBanthuam, b.tenBannhac, tl.tenTheloai,
n.tenNhacsi, c.tenCasi
FROM banthuam AS bt
INNER JOIN bannhac AS b ON bt.idBannhac = b.idBannhac
INNER JOIN theloai AS tl ON b.idTheloai = tl.idTheloai
INNER JOIN nhacsi AS n ON b.idNhacsi = n.idNhacsi
INNER JOIN casi AS c ON bt.idCasi = c.idCasi ;
Câu 2
Đề bài: Lấy danh sách các bản thu âm với idBanthuam, tenBannhac, tenTheloai, tenCasi các bản nhạc của nhạc sĩ Văn Cao.
Cách 1 — JOIN kèm điều kiện lọc
SELECT banthuam.idBanthuam,
bannhac.tenBannhac,
theloai.tenTheloai,
casi.tenCasi
FROM banthuam
INNER JOIN bannhac ON banthuam.idBannhac = bannhac.idBannhac
INNER JOIN theloai ON bannhac.idTheloai = theloai.idTheloai
INNER JOIN nhacsi ON bannhac.idNhacsi = nhacsi.idNhacsi
INNER JOIN casi ON banthuam.idCasi = casi.idCasi
WHERE nhacsi.tenNhacsi = 'Văn Cao' ;
Tuy kết quả không hiển thị tên nhạc sĩ, ta vẫn phải nối bảng nhacsi để có điều kiện lọc tenNhacsi = 'Văn Cao'.
Cách 2 — Dùng bí danh + ORDER BY
SELECT bt.idBanthuam, b.tenBannhac, tl.tenTheloai, c.tenCasi
FROM banthuam AS bt
INNER JOIN bannhac AS b ON bt.idBannhac = b.idBannhac
INNER JOIN theloai AS tl ON b.idTheloai = tl.idTheloai
INNER JOIN nhacsi AS n ON b.idNhacsi = n.idNhacsi
INNER JOIN casi AS c ON bt.idCasi = c.idCasi
WHERE n.tenNhacsi = 'Văn Cao'
ORDER BY b.tenBannhac ;
Câu 3
Đề bài: Lấy danh sách các bản thu âm với idBanthuam, tenBannhac, tenTacgia, tenTheloai các bản nhạc do ca sĩ Lê Dung thể hiện.
Cách 1 — JOIN, lọc theo ca sĩ
SELECT banthuam.idBanthuam,
bannhac.tenBannhac,
nhacsi.tenNhacsi AS tenTacgia,
theloai.tenTheloai
FROM banthuam
INNER JOIN bannhac ON banthuam.idBannhac = bannhac.idBannhac
INNER JOIN nhacsi ON bannhac.idNhacsi = nhacsi.idNhacsi
INNER JOIN theloai ON bannhac.idTheloai = theloai.idTheloai
INNER JOIN casi ON banthuam.idCasi = casi.idCasi
WHERE casi.tenCasi = 'Lê Dung' ;
Ở đây tenTacgia lấy từ nhacsi.tenNhacsi, dùng AS tenTacgia để đặt tiêu đề cột đúng yêu cầu.
Cách 2 — Dùng bí danh
SELECT bt.idBanthuam, b.tenBannhac,
n.tenNhacsi AS tenTacgia, tl.tenTheloai
FROM banthuam AS bt
INNER JOIN bannhac AS b ON bt.idBannhac = b.idBannhac
INNER JOIN nhacsi AS n ON b.idNhacsi = n.idNhacsi
INNER JOIN theloai AS tl ON b.idTheloai = tl.idTheloai
INNER JOIN casi AS c ON bt.idCasi = c.idCasi
WHERE c.tenCasi = 'Lê Dung' ;
Câu 4
Đề bài: Lấy danh sách các bản thu âm với idBanthuam, tenBannhac, tenTacgia, tenCasi các bản nhạc do ca sĩ Lê Dung thể hiện thuộc thể loại Nhạc trữ tình.
Cách 1 — JOIN với điều kiện kép
SELECT banthuam.idBanthuam,
bannhac.tenBannhac,
nhacsi.tenNhacsi AS tenTacgia,
casi.tenCasi
FROM banthuam
INNER JOIN bannhac ON banthuam.idBannhac = bannhac.idBannhac
INNER JOIN nhacsi ON bannhac.idNhacsi = nhacsi.idNhacsi
INNER JOIN theloai ON bannhac.idTheloai = theloai.idTheloai
INNER JOIN casi ON banthuam.idCasi = casi.idCasi
WHERE casi.tenCasi = 'Lê Dung'
AND theloai.tenTheloai = 'Nhạc trữ tình' ;
Có hai điều kiện nối bằng AND: vừa do Lê Dung thể hiện, vừa thuộc thể loại Nhạc trữ tình. Phải JOIN cả casi và theloai để có hai trường lọc này.
Cách 2 — Dùng bí danh
SELECT bt.idBanthuam, b.tenBannhac,
n.tenNhacsi AS tenTacgia, c.tenCasi
FROM banthuam AS bt
INNER JOIN bannhac AS b ON bt.idBannhac = b.idBannhac
INNER JOIN nhacsi AS n ON b.idNhacsi = n.idNhacsi
INNER JOIN theloai AS tl ON b.idTheloai = tl.idTheloai
INNER JOIN casi AS c ON bt.idCasi = c.idCasi
WHERE c.tenCasi = 'Lê Dung'
AND tl.tenTheloai = 'Nhạc trữ tình' ;
⚠️ Lưu ý thi: Khi có nhiều điều kiện lọc dùngAND(đồng thời thoả) hoặcOR(một trong các điều kiện). Đặt nhầmAND/ORlà lỗi sai phổ biến.
⚙️ VẬN DỤNG
Đề bài: Thực hành truy xuất bảng Quận/Huyện qua liên kết với bảng Tỉnh/Thành phố.
Hướng dẫn: Đây là bài tự thực hành với CSDL địa giới hành chính. Mô hình hai bảng tương tự bannhac – nhacsi:
- tinhthanh(idTinh, tenTinh)
- quanhuyen(idQuan, tenQuan, idTinh) —
idTinhlà khoá ngoài tham chiếu bảngtinhthanh.
Câu truy vấn lấy danh sách quận/huyện kèm tên tỉnh/thành phố trực thuộc:
SELECT quanhuyen.idQuan,
quanhuyen.tenQuan,
tinhthanh.tenTinh
FROM quanhuyen
INNER JOIN tinhthanh
ON quanhuyen.idTinh = tinhthanh.idTinh
ORDER BY tinhthanh.tenTinh ;
Muốn lấy các quận/huyện của một tỉnh cụ thể (ví dụ Hà Nội):
SELECT q.idQuan, q.tenQuan, t.tenTinh
FROM quanhuyen AS q
INNER JOIN tinhthanh AS t ON q.idTinh = t.idTinh
WHERE t.tenTinh = 'Hà Nội' ;
Bài này giúp em rèn lại đúng kỹ năng JOIN hai bảng theo khoá ngoài đã học ở Nhiệm vụ 1.
🎯 Ghi nhớ: - Mỗi khi cần một trường không có sẵn trong bảng đang xét, hãyINNER JOINsang bảng chứa trường đó qua cặp khoá chính – khoá ngoài. - Thêm một bảng = thêm một dòngINNER JOIN ... ON .... -WHEREdùng để lọc (kết hợpAND/OR),ORDER BYdùng để sắp xếp,ASdùng để đặt tên cột/bí danh bảng. - Giao diện ứng dụng giúp người dùng thao tác mà không cần biết cấu trúc bảng, đồng thời nhập liệu bằng hộp chọn để đảm bảo tính nhất quán của dữ liệu.
