Giải Tin Học trang 110
Lời giải chi tiết SGK Lớp 11 · Môn Tin Há»c · Trang 110–111
Hai trang này thuộc Bài 23 "Thực hành truy xuất dữ liệu qua liên kết các bảng". Đây là bài thực hành nên không có bài tập trắc nghiệm, mà là phần hướng dẫn thao tác. Mình sẽ tóm tắt lý thuyết và giải thích chi tiết từng đoạn lệnh SQL nhé.
Tóm tắt lý thuyết
Mục tiêu bài học: hiểu cách truy xuất dữ liệu từ nhiều bảng có quan hệ với nhau thông qua khoá ngoài.
Ý tưởng chính:
- Các bảng trong CSDL có thể liên kết với nhau qua khoá ngoài (foreign key).
- Nhờ liên kết này, ta lấy được dữ liệu nằm rải rác ở nhiều bảng trong cùng một kết quả.
- Công cụ thực hành: phần mềm HeidiSQL với CSDL tên là mymusic.
Hai bảng được dùng:
| Bảng | Cấu trúc | Vai trò |
|---|---|---|
bannhac | bannhac (idBannhac, tenBannhac, idNhacsi, idTheloai) | Lưu thông tin bản nhạc. idNhacsi là khoá ngoài |
nhacsi | nhacsi (idNhacsi, tenNhacsi) | Lưu tên nhạc sĩ. idNhacsi là khoá chính |
Vấn đề đặt ra: bảng bannhac chỉ có idNhacsi (mã số), không có tenNhacsi (tên nhạc sĩ). Muốn vừa hiển thị tên bản nhạc vừa hiển thị tên tác giả thì phải nối hai bảng lại.
Nhiệm vụ 1: Lập danh sách bản nhạc kèm tên tác giả
Cấu trúc tổng quát của câu truy vấn dùng mệnh đề JOIN:
SELECT danh_sách_tên_trường_của_2_bảng
FROM tên_bảng_a INNER JOIN tên_bảng_b
ON tên_bảng_a.tên_trường_a = tên_bảng_b.tên_trường_b
[WHERE ... ]
[ORDER BY ... ];
Giải thích từng phần:
SELECT: chọn các trường muốn hiển thị (có thể lấy từ cả hai bảng).FROM ... INNER JOIN ...: khai báo hai bảng cần nối.ON ...: điều kiện nối, tức là cặp trường khoá phải bằng nhau. Đây là chỗ "ghép" hai bảng theo khoá.[WHERE ...]và[ORDER BY ...]: tuỳ chọn (dấu ngoặc vuông nghĩa là có thể có hoặc không), dùng để lọc và sắp xếp.
Câu truy vấn cụ thể cho nhiệm vụ:
SELECT bannhac.tenBannhac, nhacsi.tenNhacsi
FROM bannhac INNER JOIN nhacsi
ON bannhac.idNhacsi = nhacsi.idNhacsi;
Cách đọc câu lệnh:
- Lấy ra hai cột:
tenBannhac(từ bảngbannhac) vàtenNhacsi(từ bảngnhacsi). - Nối bảng
bannhacvới bảngnhacsi. - Điều kiện nối:
bannhac.idNhacsi = nhacsi.idNhacsi, nghĩa là mỗi bản nhạc khớp với nhạc sĩ có cùng mãidNhacsi.
Vì sao phải viết rõ tên_bảng.tên_trường? Bởi cả hai bảng đều có trường idNhacsi trùng tên. Ghi rõ tên bảng phía trước giúp máy biết ta đang nói đến trường của bảng nào, tránh nhầm lẫn.
Cách chạy trong HeidiSQL:
- Mở HeidiSQL, chọn CSDL
mymusic. - Chọn thẻ Truy vấn, nhập câu lệnh trên.
- Nhấn F9 (hoặc nhấn biểu tượng chạy / chuột phải chọn Chạy).
Kết quả (Hình 23.1): bảng kết quả có 4 cột (idBannhac, tenBannhac, idNhacsi, tenNhacsi) với 8 dòng, ví dụ "Du kích sông Thao – Đỗ Nhuận", "Trường ca sông Lô – Văn Cao"...
Mở rộng: Hiển thị thêm khoá để đối chiếu
Nếu muốn kết quả hiển thị cả idNhacsi của từng bảng để đối chiếu tường minh, ta dùng từ khoá AS để đổi tên cột hiển thị (vì hai trường cùng tên cần phân biệt):
SELECT
bannhac.tenBannhac, bannhac.idNhacsi as idNS_BN,
nhacsi.idNhacsi as idNS_NS, nhacsi.tenNhacsi
FROM bannhac INNER JOIN nhacsi
ON bannhac.idNhacsi = nhacsi.idNhacsi;
Giải thích:
bannhac.idNhacsi as idNS_BN: lấyidNhacsicủa bảngbannhac, hiển thị dưới tên cột mớiidNS_BN(NS = nhạc sĩ, BN = bản nhạc).nhacsi.idNhacsi as idNS_NS: lấyidNhacsicủa bảngnhacsi, hiển thị tênidNS_NS.- Nhờ đổi tên, hai cột khoá nằm cạnh nhau và ta dễ dàng kiểm tra chúng có bằng nhau không (Hình 23.2). Đúng theo điều kiện JOIN, hai cột này luôn khớp giá trị từng dòng.
AS chỉ đổi tên hiển thị (bí danh / alias), không làm thay đổi dữ liệu trong bảng gốc.
Lưu ý khi dùng HeidiSQL
- Phần mềm dùng màu sắc để tô cú pháp (syntax coloring), giúp quan sát câu truy vấn dễ hơn.
- Mỗi khi gõ tên bảng kèm dấu chấm
., HeidiSQL tự gợi ý danh sách tên trường của bảng đó để chọn, giảm gõ sai.
Một mẹo nhỏ: thói quen viết đầy đủ tên_bảng.tên_trường không chỉ cần khi tên trùng, mà còn giúp câu lệnh rõ ràng và dễ đọc lại về sau.
