Mục lục (5 phần)
Cơ sở dữ liệu là kiến thức lớp 11 nhưng xuất hiện đều đặn: phần I có 2–3 câu (khóa chính, khóa ngoài, câu lệnh SQL), phần II định hướng ICT gần như luôn có một câu đúng/sai cho hai bảng dữ liệu kèm vài câu truy vấn. Muốn làm nhanh, em phải "chạy tay" được câu SQL trên bảng cho sẵn.
Kiến thức trọng tâm
Các khái niệm cơ bản
| Khái niệm | Nghĩa |
|---|---|
| Cơ sở dữ liệu (CSDL) | Tập hợp dữ liệu có liên quan, được lưu trữ có tổ chức để nhiều người khai thác |
| Hệ quản trị CSDL | Phần mềm để tạo lập, cập nhật, truy vấn, bảo mật CSDL |
| Hệ CSDL | CSDL + hệ quản trị CSDL (+ ứng dụng khai thác) |
| Bảng (quan hệ) | Dữ liệu về một loại đối tượng, gồm hàng và cột |
| Bản ghi | Một hàng của bảng (một đối tượng) |
| Trường | Một cột của bảng (một thuộc tính), có kiểu dữ liệu xác định |
| Khóa chính | Trường (nhóm trường) có giá trị duy nhất, không rỗng, phân biệt các bản ghi |
| Khóa ngoài | Trường của bảng này tham chiếu tới khóa chính của bảng khác, dùng để liên kết |
Kiểu dữ liệu hay gặp: INT (số nguyên), FLOAT (số thực), CHAR(n) (xâu dài cố định), VARCHAR(n) (xâu dài tối đa n),
DATE (ngày), BOOLEAN (đúng/sai).
CSDL mẫu dùng trong bài
Câu lạc bộ Tình nguyện quản lí học sinh và các lượt tham gia hoạt động:
CREATE TABLE HOCSINH (
MaHS CHAR(4) PRIMARY KEY,
HoTen VARCHAR(50) NOT NULL,
Lop CHAR(4)
);
CREATE TABLE THAMGIA (
MaTG CHAR(3) PRIMARY KEY,
MaHS CHAR(4),
HoatDong VARCHAR(30),
SoGio INT,
FOREIGN KEY (MaHS) REFERENCES HOCSINH(MaHS)
);Bảng HOCSINH
| Ma |
Ho |
Lop |
|---|---|---|
| HS01 | Lê An | 11A1 |
| HS02 | Trần Bảo | 11A2 |
| HS03 | Phạm Chi | 11A1 |
| HS04 | Ngô Dũng | 11A3 |
| HS05 | Vũ Hà | 11A2 |
Bảng THAMGIA
| Ma |
Ma |
Hoat |
So |
|---|---|---|---|
| T01 | HS01 | Dọn vệ sinh | 3 |
| T02 | HS02 | Trồng cây | 4 |
| T03 | HS01 | Trồng cây | 5 |
| T04 | HS03 | Thư viện | 2 |
| T05 | HS05 | Dọn vệ sinh | 3 |
| T06 | HS02 | Thư viện | 6 |
| T07 | HS01 | Thư viện | 2 |
Tóm tắt câu lệnh SQL
| Câu lệnh | Công dụng |
|---|---|
CREATE TABLE / ALTER TABLE / DROP TABLE |
Tạo / sửa cấu trúc / xóa cả bảng |
INSERT INTO … VALUES (…) |
Thêm bản ghi |
UPDATE … SET … WHERE … |
Sửa dữ liệu các bản ghi thỏa điều kiện |
DELETE FROM … WHERE … |
Xóa bản ghi thỏa điều kiện (bảng vẫn còn) |
SELECT … FROM … WHERE … |
Truy vấn, lọc dữ liệu |
ORDER BY … ASC/DESC |
Sắp xếp tăng/giảm (mặc định tăng) |
INNER JOIN … ON … |
Ghép hai bảng theo điều kiện (thường khóa ngoài = khóa chính) |
GROUP BY … + COUNT, SUM, AVG, MAX, MIN |
Gom nhóm và thống kê từng nhóm |
HAVING … |
Lọc nhóm sau khi gom (WHERE lọc bản ghi trước khi gom) |
Toán tử trong điều kiện: =, <>, >, >=, AND, OR, NOT, BETWEEN 2 AND 5, IN ('11A1', '11A2'), LIKE 'Trần%'
(họ Trần; % thay cho dãy kí tự bất kì).
SELECT, WHERE, ORDER BY
SELECT HoTen, Lop
FROM HOCSINH
WHERE Lop = '11A1'
ORDER BY HoTen;Kết quả: hai dòng Lê An – 11A1 và Phạm Chi – 11A1.
Ghép bảng với INNER JOIN
SELECT HOCSINH.HoTen, THAMGIA.HoatDong, THAMGIA.SoGio
FROM HOCSINH INNER JOIN THAMGIA
ON HOCSINH.MaHS = THAMGIA.MaHS
WHERE THAMGIA.SoGio >= 4
ORDER BY THAMGIA.SoGio DESC;| Ho |
Hoat |
So |
|---|---|---|
| Trần Bảo | Thư viện | 6 |
| Lê An | Trồng cây | 5 |
| Trần Bảo | Trồng cây | 4 |
INNER JOIN chỉ giữ những cặp bản ghi khớp nhau: Ngô Dũng (HS04) chưa tham gia hoạt động nào nên không bao giờ xuất hiện.
GROUP BY và HAVING — vết thực hiện từng bước
SELECT HOCSINH.HoTen, COUNT(*) AS SoLan,
SUM(THAMGIA.SoGio) AS TongGio
FROM HOCSINH INNER JOIN THAMGIA
ON HOCSINH.MaHS = THAMGIA.MaHS
GROUP BY HOCSINH.MaHS, HOCSINH.HoTen
HAVING SUM(THAMGIA.SoGio) >= 8
ORDER BY HOCSINH.HoTen;Thứ tự máy xử lí: FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.
| Bước | Kết quả trung gian |
|---|---|
| JOIN | 7 dòng (mỗi lượt tham gia kèm họ tên) |
| GROUP BY | 4 nhóm: HS01 (3, 5, 2), HS02 (4, 6), HS03 (2), HS05 (3) |
| Tính tổng | HS01: 10 · HS02: 10 · HS03: 2 · HS05: 3 |
| HAVING ≥ 8 | Còn HS01, HS02 |
| SELECT + ORDER BY | Lê An – 3 – 10, Trần Bảo – 2 – 10 |
Bảo mật và an toàn CSDL
Xác thực người dùng (tài khoản, mật khẩu), phân quyền (người chỉ được xem, người được sửa), mã hóa dữ liệu nhạy cảm, ghi nhật kí truy cập, sao lưu định kì để khôi phục khi có sự cố.
Dạng bài thường gặp trong đề thi
Dạng 1: Chọn khóa chính, khóa ngoài
Xem lời giải
MaHS trong THAMGIA tham chiếu tới khóa chính MaHS của HOCSINH → khóa ngoài. MaHS không làm khóa chính của THAMGIA được vì một học sinh tham gia nhiều lần (HS01 xuất hiện 3 lần) → giá trị bị trùng. Khóa chính của THAMGIA là MaTG.
Dạng 2: Câu đúng/sai với chuỗi câu lệnh
Xem lời giải
- a) Đúng. T04: 2 → 3, T06: 6 → 7, T07: 2 → 3; tổng .
- b) Sai. Sau UPDATE, T04 và T07 đã thành 3 giờ; không còn bản ghi nào có
SoGio < 3nên không bản ghi nào bị xóa. Bẫy: quên rằng các câu lệnh chạy lần lượt, câu sau thấy dữ liệu đã bị câu trước sửa. - c) Đúng. Mã T08 chưa có nên không vi phạm khóa chính, nhưng HS09 không tồn tại trong HOCSINH → vi phạm khóa ngoài.
- d) Sai. Có 3 nhóm: Thư viện (3 lượt, 13 giờ), Trồng cây (2 lượt, 9 giờ), Dọn vệ sinh (2 lượt, 6 giờ).
DESCsắp giảm dần theo tổng giờ nên Thư viện đứng đầu, dòng cuối làDọn vệ sinh – 2 – 6.
Dạng 3: Chọn câu SQL đúng yêu cầu
Xem lời giải
Lớp nằm ở HOCSINH, số giờ nằm ở THAMGIA → phải ghép bảng, rồi gom theo lớp và cộng số giờ → B.
A sai vì THAMGIA không có trường Lop; C chỉ liệt kê, không tính tổng; D đếm số lượt chứ không cộng số giờ. Kết quả của B: 11A1 có 12 giờ (HS01: 10, HS03: 2), 11A2 có 13 giờ (HS02: 10, HS05: 3).
Dạng 4: Chạy tay điều kiện có cả AND và OR
Xem lời giải
AND được tính trước OR (giống nhân trước cộng). Câu 1 thực chất là HoatDong = 'Thư viện' OR (HoatDong = 'Trồng cây' AND SoGio >= 5): mọi lượt Thư viện đều được lấy. Câu 2 lấy Thư viện hoặc Trồng cây, rồi mới đòi SoGio >= 5.
Xét từng bản ghi:
| Bản ghi | Câu 1 | Câu 2 |
|---|---|---|
| T01 · Dọn vệ sinh · 3 | loại | loại |
| T02 · Trồng cây · 4 | loại (4 < 5) | loại |
| T03 · Trồng cây · 5 | lấy | lấy |
| T04 · Thư viện · 2 | lấy | loại (2 < 5) |
| T05 · Dọn vệ sinh · 3 | loại | loại |
| T06 · Thư viện · 6 | lấy | lấy |
| T07 · Thư viện · 2 | lấy | loại |
Câu 1 trả về 4 dòng: T03, T04, T06, T07. Câu 2 trả về 2 dòng:
| Ma |
Hoat |
So |
|---|---|---|
| T03 | Trồng cây | 5 |
| T06 | Thư viện | 6 |
Khi trộn AND với OR, luôn đặt ngoặc cho đúng ý muốn hỏi.
Dạng 5: Ghép bảng, lọc rồi gom nhóm
Xem lời giải
Chạy theo thứ tự FROM/JOIN → WHERE → GROUP BY → SELECT → ORDER BY:
| Bước | Kết quả trung gian |
|---|---|
| JOIN | 7 dòng, mỗi lượt tham gia kèm lớp |
| WHERE | Bỏ T04, T06, T07 (Thư viện), còn T01 (11A1, 3), T02 (11A2, 4), T03 (11A1, 5), T05 (11A2, 3) |
| GROUP BY | 11A1: 3 và 5 · 11A2: 4 và 3 |
| COUNT, SUM | 11A1: 2 lượt, 8 giờ · 11A2: 2 lượt, 7 giờ |
| ORDER BY | Giảm dần theo Tong |
| Lop | So |
Tong |
|---|---|---|
| 11A1 | 2 | 8 |
| 11A2 | 2 | 7 |
Đáp án D.
- A sai: INNER JOIN bỏ HS04 (chưa tham gia) nên không có dòng nào của 11A3.
- B là kết quả khi quên WHERE: 11A2 có 3 lượt, 13 giờ; 11A1 có 4 lượt, 12 giờ.
- C sai: sau khi lọc còn 4 lượt, nhưng GROUP BY gom các lượt cùng lớp thành một dòng nên chỉ còn 2 dòng. (Nếu bỏ GROUP BY thì COUNT, SUM gộp cả 4 lượt thành một dòng hoặc hệ quản trị báo lỗi — cũng không ra 4 dòng.)
Dạng 6: Chuỗi lệnh xóa, sửa vướng ràng buộc khóa ngoài
Xem lời giải
Theo dõi bảng sau từng câu lệnh:
| Câu lệnh | Kết quả | HOCSINH còn |
|---|---|---|
| Xóa HS04 | Thành công: không lượt nào tham chiếu HS04 | 4 bản ghi |
| Xóa HS05 | Bị từ chối: T05 đang tham chiếu HS05 | 4 bản ghi |
| Sửa T05 thành HS04 | Bị từ chối: HS04 vừa bị xóa | 4 bản ghi |
SELECT COUNT(*) |
Trả về 4 |
- a) Sai. Có HS05 chưa đủ: bản ghi "cha" đang được tham chiếu thì không xóa được (hệ quản trị báo lỗi vi phạm ràng buộc khóa ngoài).
- b) Đúng. HS04 (Ngô Dũng) chưa tham gia hoạt động nào nên xóa được.
- c) Đúng. Giá trị khóa ngoài mới phải có trong bảng được tham chiếu; HS04 đã bị câu lệnh thứ nhất xóa. Bẫy: nhớ HS04 "có trong CSDL mẫu" mà quên câu lệnh trước đã thay đổi dữ liệu.
- d) Sai. Chỉ câu lệnh thứ nhất thành công: bản ghi.
Lỗi thường gặp
Mẹo làm bài
Tự kiểm tra nhanh
- Câu lệnh sau trả về số nào?
SELECT COUNT(DISTINCT MaHS) FROM THAMGIA;Xem đáp án
4 — có 7 lượt tham gia nhưng chỉ của 4 học sinh khác nhau (HS01, HS02, HS03, HS05). DISTINCT loại các giá trị trùng trước khi đếm.
- Viết câu lệnh cho biết sĩ số (số học sinh) của mỗi lớp trong bảng HOCSINH.
Xem đáp án
SELECT Lop, COUNT(*) AS SiSo
FROM HOCSINH
GROUP BY Lop;Kết quả: 11A1 – 2, 11A2 – 2, 11A3 – 1.
- Câu
SELECT HoTen FROM HOCSINH WHERE Lop = '11A2' AND MaHS <> 'HS02';trả về ai?
Xem đáp án
Vũ Hà. Lớp 11A2 có HS02 và HS05; điều kiện MaHS <> 'HS02' loại Trần Bảo.
- Vì sao không nên chọn HoTen làm khóa chính của bảng HOCSINH?
Xem đáp án
Hai học sinh có thể trùng họ tên, trong khi khóa chính phải có giá trị duy nhất cho mỗi bản ghi.
- Phân biệt WHERE và HAVING.
Xem đáp án
WHERE lọc từng bản ghi trước khi gom nhóm; HAVING lọc các nhóm sau GROUP BY, thường dùng với hàm thống kê như SUM, COUNT.
Làm 10 câu luyện tập về cơ sở dữ liệu và sql và xem lời giải ngay sau mỗi câu.