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ảngCấu trúcVai trò
bannhacbannhac (idBannhac, tenBannhac, idNhacsi, idTheloai)Lưu thông tin bản nhạc. idNhacsi là khoá ngoài
nhacsinhacsi (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 ...][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ảng bannhac) và tenNhacsi (từ bảng nhacsi).
  • Nối bảng bannhac với bảng nhacsi.
  • Đ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:

  1. Mở HeidiSQL, chọn CSDL mymusic.
  2. Chọn thẻ Truy vấn, nhập câu lệnh trên.
  3. 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ấy idNhacsi của bảng bannhac, hiển thị dưới tên cột mới idNS_BN (NS = nhạc sĩ, BN = bản nhạc).
  • nhacsi.idNhacsi as idNS_NS: lấy idNhacsi của bảng nhacsi, hiển thị tên idNS_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.

Chế độ đọc sách →