Giải Tin Học trang 108

Lời giải chi tiết SGK Lớp 11 · Môn Tin Học · Trang 108–109

Tóm tắt lý thuyết

Phần này thuộc Bài 22 nói về thực hành với hệ quản trị cơ sở dữ liệu (HeidiSQL/MySQL) cho CSDL âm nhạc mymusic. Các ý chính:

  • Toàn vẹn tham chiếu (khoá ngoài): Khi một giá trị (ví dụ idNhacsi của Văn Cao là 2) đang được tham chiếu ở bảng bannhac, MySQL sẽ ngăn không cho xoá dòng tương ứng ở bảng nhacsi. Nếu cố xoá, hệ thống báo lỗi SQL Error (1451): Cannot delete or update a parent row: a foreign key constraint fails (Hình 22.6).
  • Hệ QTCSDL chỉ ngăn được các lỗi theo lôgic đã khai báo (như lôgic khoá ngoài). Những lỗi không liên quan đến lôgic (nhập sai tên bản nhạc, sai tên người…) thì hệ thống không thể phát hiện. Vì vậy người làm việc với CSDL phải cẩn thận, mẫn cán.
  • Truy xuất dữ liệu trong bảng bannhac hoàn toàn tương tự như truy xuất ở bảng nhacsi (Bài 21).
  • Giao diện ứng dụng "Quản lí dữ liệu âm nhạc" (Hình 22.7) được thiết kế hướng vào nghiệp vụ hằng ngày, tích hợp Nhập, Tìm, Sửa, Xoá vào một giao diện duy nhất, người dùng không cần biết cấu trúc bảng.

Giả định cấu trúc bảng dùng trong lời giải:

  • bannhac(idBannhac, tenBannhac, idNhacsi)
  • nhacsi(idNhacsi, tenNhacsi)

Bài e) Truy xuất dữ liệu trong bảng bannhac

Câu 1: Truy xuất theo thứ tự giảm dần của idBannhac, theo thứ tự tên bản nhạc

Đề: Hãy thực hành các truy xuất dữ liệu theo thứ tự giảm dần của trường idBannhac, theo thứ tự tên các bản nhạc.

Lời giải:

Sắp xếp giảm dần theo idBannhac:

SELECT idBannhac, tenBannhac, idNhacsi
FROM bannhac
ORDER BY idBannhac DESC;

Sắp xếp tăng dần theo tên bản nhạc (theo bảng chữ cái):

SELECT idBannhac, tenBannhac, idNhacsi
FROM bannhac
ORDER BY tenBannhac ASC;

Giải thích: ORDER BY dùng để sắp xếp kết quả. DESC là giảm dần, ASC (mặc định) là tăng dần. Trong HeidiSQL bạn cũng có thể bấm vào tiêu đề cột để sắp xếp nhanh, nhưng viết câu lệnh giúp hiểu rõ bản chất.

Câu 2: Lấy danh sách tên các bản nhạc của nhạc sĩ Văn Cao

Đề: Hãy thực hành lấy ra danh sách tên các bản nhạc của nhạc sĩ Văn Cao có trong bảng bannhac.

Lời giải:

Vì biết idNhacsi của Văn Cao là 2 (theo ví dụ trong sách):

SELECT tenBannhac
FROM bannhac
WHERE idNhacsi = 2;

Cách viết tổng quát hơn, kết nối hai bảng để không cần nhớ mã số:

SELECT b.tenBannhac
FROM bannhac b
JOIN nhacsi n ON b.idNhacsi = n.idNhacsi
WHERE n.tenNhacsi = 'Văn Cao';

Giải thích: Cách thứ nhất dùng trực tiếp idNhacsi = 2 nhanh nhưng phải nhớ mã. Cách thứ hai dùng phép kết nối (JOIN) để lọc theo tên nhạc sĩ, an toàn và dễ đọc hơn. Kết quả sẽ gồm "Trường ca sông Lô", "Tiến về Hà Nội" (các bản nhạc của Văn Cao trong dữ liệu mẫu).


Nhiệm vụ 2: Tìm hiểu chức năng phần mềm Quản lí dữ liệu âm nhạc

Đề: Hãy tìm hiểu một chức năng của phần mềm ứng dụng Quản lí dữ liệu âm nhạc qua giao diện ở Hình 22.7, so sánh với những kiến thức vừa học và cho nhận xét.

Gợi ý trả lời:

Chọn chức năng Nhập (thêm bản nhạc mới) để so sánh:

Tiêu chíLàm trực tiếp trên HeidiSQL/SQLLàm qua giao diện ứng dụng (Hình 22.7)
Thao tácViết câu INSERT INTO bannhac ... hoặc gõ vào lưới dữ liệuGõ tên bản nhạc, chọn nhạc sĩ từ danh sách rồi bấm Nhập
Yêu cầu kiến thứcPhải biết tên bảng, tên trường, kiểu dữ liệu, khoá ngoàiKhông cần biết cấu trúc bảng
Chọn nhạc sĩPhải nhập đúng idNhacsiChọn tên nhạc sĩ từ hộp danh sách, hệ thống tự gán mã
Khả năng sai sótDễ nhập sai mã, sai khoá ngoàiHộp danh sách hạn chế sai sót về mã

Nhận xét: Giao diện ứng dụng che giấu cấu trúc CSDL, hướng vào nghiệp vụ nên dễ dùng cho người không chuyên. Còn làm trực tiếp bằng SQL thì linh hoạt, mạnh mẽ hơn nhưng đòi hỏi hiểu biết kĩ thuật. Cả hai đều cho cùng kết quả ở tầng dữ liệu.


Phần Hướng dẫn (hai câu hỏi cuối)

Câu hỏi 1: Người sử dụng có cần biết, nhớ cấu trúc bảng bannhac, nhacsi không?

Trả lời: Không cần. Đây chính là ưu điểm của giao diện ứng dụng chuyên biệt. Mọi thao tác nhập, sửa, xoá, tìm đều thực hiện qua các ô và nút trực quan; phần mềm tự sinh câu lệnh SQL phía sau và tự xử lí khoá ngoài. Người dùng chỉ cần biết nghiệp vụ (tên bản nhạc, tên nhạc sĩ) chứ không cần biết tên trường hay mã số.

Câu hỏi 2: Giao diện trên có dễ hiểu, dễ sử dụng không?

Trả lời: Có. Giao diện gom tất cả chức năng vào một màn hình, dùng các thành phần quen thuộc:

  • Ô nhập tên bản nhạc, hộp danh sách chọn nhạc sĩ → tránh sai chính tả tên người.
  • Nút Nhập, Tìm, Xoá rõ ràng.
  • Bảng danh sách phân trang (10 dòng mỗi trang) dễ theo dõi.
  • Nút radio để chọn dòng cần sửa, checkbox để chọn nhiều dòng cần xoá.

Nhờ vậy, người chưa biết về CSDL vẫn dùng được, giảm sai sót và tiết kiệm thời gian.


LUYỆN TẬP

Bài 1: Cập nhật dữ liệu vào bảng banthuam

Đề: Cập nhật dữ liệu vào bảng banthuam.

Lời giải (giả sử banthuam(idBanthuam, idBannhac, idCasi, ...)):

Thêm bản thu âm mới:

INSERT INTO banthuam (idBannhac, idCasi)
VALUES (2, 1);

Sửa một bản thu âm đã có:

UPDATE banthuam
SET idCasi = 3
WHERE idBanthuam = 5;

Xoá một bản thu âm:

DELETE FROM banthuam
WHERE idBanthuam = 5;

Giải thích: "Cập nhật dữ liệu" gồm ba thao tác cơ bản: thêm (INSERT), sửa (UPDATE), xoá (DELETE). Lưu ý khi nhập idBannhac, idCasi phải là các giá trị đã tồn tại trong bảng bannhac, casi (vì là khoá ngoài), nếu không sẽ bị lỗi toàn vẹn tham chiếu giống Hình 22.6.

Bài 2: Truy xuất dữ liệu bảng banthuam theo các tiêu chí khác nhau

Đề: Truy xuất dữ liệu bảng banthuam theo các tiêu chí khác nhau.

Lời giải:

Lấy toàn bộ bản thu âm, sắp xếp giảm dần theo mã:

SELECT * FROM banthuam
ORDER BY idBanthuam DESC;

Lấy các bản thu âm của một ca sĩ cụ thể (ví dụ ca sĩ có mã 1):

SELECT * FROM banthuam
WHERE idCasi = 1;

Truy xuất kết hợp nhiều bảng để hiển thị tên (dễ đọc cho người dùng):

SELECT bn.tenBannhac, c.tenCasi
FROM banthuam bt
JOIN bannhac bn ON bt.idBannhac = bn.idBannhac
JOIN casi   c  ON bt.idCasi   = c.idCasi
ORDER BY bn.tenBannhac;

Giải thích: "Theo các tiêu chí khác nhau" nghĩa là dùng WHERE để lọc, ORDER BY để sắp xếp, và JOIN để hiển thị thông tin từ nhiều bảng. Đây là cách rèn luyện kĩ năng truy vấn linh hoạt.


VẬN DỤNG

Cập nhật và truy xuất bảng Quận/Huyện

Đề: Hãy thực hành cập nhật và truy xuất bảng Quận/Huyện trong CSDL quản lí danh sách tên các Quận/Huyện, Tỉnh/Thành phố.

Lời giải (giả sử cấu trúc):

  • tinh(idTinh, tenTinh)
  • quanhuyen(idQH, tenQH, idTinh) với idTinh là khoá ngoài tham chiếu tinh.

Cập nhật dữ liệu:

-- Thêm một tỉnh/thành phố
INSERT INTO tinh (tenTinh) VALUES ('Hà Nội');

-- Thêm một quận/huyện thuộc tỉnh đó
INSERT INTO quanhuyen (tenQH, idTinh) VALUES ('Quận Ba Đình', 1);

-- Sửa tên quận/huyện
UPDATE quanhuyen
SET tenQH = 'Quận Hoàn Kiếm'
WHERE idQH = 2;

-- Xoá một quận/huyện
DELETE FROM quanhuyen
WHERE idQH = 2;

Truy xuất dữ liệu:

-- Danh sách quận/huyện của một tỉnh, kèm tên tỉnh
SELECT qh.tenQH, t.tenTinh
FROM quanhuyen qh
JOIN tinh t ON qh.idTinh = t.idTinh
WHERE t.tenTinh = 'Hà Nội'
ORDER BY qh.tenQH;

Giải thích: Bài này áp dụng lại đúng các kĩ năng đã học (INSERT/UPDATE/DELETE và SELECT có JOIN, WHERE, ORDER BY) cho một CSDL hai bảng có quan hệ khoá ngoài. Lưu ý không thể xoá một tỉnh khi vẫn còn quận/huyện tham chiếu tới nó, đúng như nguyên tắc toàn vẹn tham chiếu nêu trong bài.


Chế độ đọc sách →