Chưa học môn
Tìm sinh viên chưa học môn IS210.
Mục tiêu: Hệ thống lại toàn bộ kiến thức Tuần 1-5, đọc và phân tích bài toán quản lý thực tế, xác định Entity/Attribute/Relationship, chuyển từ ER/EER sang mô hình quan hệ, và kết hợp nhiều kỹ thuật SQL để giải quyết một bài toán hoàn chỉnh.
01 · MỤC TIÊU & BỨC TRANH TỔNG QUAN
Sau Tuần 6, sinh viên có thể:
SELECT, WHERE, ORDER BY, GROUP BY, HAVING, JOIN, Subquery, hàm tổng hợp, INSERT, UPDATE, DELETESinh viên cần nhìn lại toàn bộ quy trình xây dựng một CSDL:
02 · ÔN TẬP MÔ HÌNH CƠ SỞ DỮ LIỆU
Entity là đối tượng cần quản lý trong hệ thống. Ví dụ hệ thống quản lý sinh viên:
Ví dụ Entity SINHVIEN:
| Attribute | Ý nghĩa |
|---|---|
| MaSV | Định danh sinh viên |
| HoTen | Tên sinh viên |
| NgaySinh | Ngày sinh |
| GioiTinh | Giới tính |
| MaLop | Lớp sinh viên |
03 · KHÓA TRONG CƠ SỞ DỮ LIỆU
Primary Key dùng để định danh duy nhất một bản ghi:
CREATE TABLE SinhVien (
MaSV VARCHAR(10) PRIMARY KEY,
HoTen NVARCHAR(100),
NgaySinh DATE
);MaSV không được trùng và không được NULL.
Foreign Key dùng để tạo mối quan hệ giữa các bảng:
CREATE TABLE SinhVien (
MaSV VARCHAR(10) PRIMARY KEY,
HoTen NVARCHAR(100),
MaLop VARCHAR(10),
FOREIGN KEY (MaLop)
REFERENCES Lop(MaLop)
);Quan hệ - Một lớp có nhiều sinh viên:
04 · ÔN TẬP TẠO CƠ SỞ DỮ LIỆU & INSERT
Ví dụ xây dựng CSDL Quản lý sinh viên và kết quả học tập, gồm 4 bảng LOP, SINHVIEN, MONHOC, KETQUA với quan hệ:
LOP (1) ➜ SINHVIEN (N): Một lớp có nhiều sinh viên.
SINHVIEN (1) ➜ KETQUA (N): Một sinh viên có nhiều kết quả học tập.
MONHOC (1) ➜ KETQUA (N): Một môn học có nhiều kết quả học tập.
CREATE TABLE Lop (
MaLop VARCHAR(10) PRIMARY KEY,
TenLop NVARCHAR(100)
);
CREATE TABLE MonHoc (
MaMH VARCHAR(10) PRIMARY KEY,
TenMH NVARCHAR(100),
SoTinChi INT
);
CREATE TABLE SinhVien (
MaSV VARCHAR(10) PRIMARY KEY,
HoTen NVARCHAR(100),
MaLop VARCHAR(10),
FOREIGN KEY (MaLop)
REFERENCES Lop(MaLop)
);INSERT INTO Lop
VALUES
('HTTT01', N'Hệ thống thông tin 01'),
('HTTT02', N'Hệ thống thông tin 02');
INSERT INTO SinhVien
VALUES
('SV001', N'Nguyễn Văn An', 'HTTT01'),
('SV002', N'Trần Văn Bình', 'HTTT01'),
('SV003', N'Lê Văn Cường', 'HTTT02');SinhVien có Foreign Key đến Lop, phải tồn tại HTTT01, HTTT02 trong bảng Lop trước khi thêm sinh viên.05 · ÔN TẬP SELECT, WHERE & LIKE
Lấy toàn bộ dữ liệu:
SELECT *
FROM SinhVien;Chọn một số cột và đặt bí danh:
SELECT
MaSV AS [Mã sinh viên],
HoTen AS [Họ tên]
FROM SinhVien;Tìm các sinh viên thuộc lớp HTTT01:
SELECT *
FROM SinhVien
WHERE MaLop = 'HTTT01';Nhiều điều kiện:
SELECT *
FROM SinhVien
WHERE MaLop = 'HTTT01'
AND HoTen LIKE N'Nguyễn%';% và _Xem chi tiết đầy đủ về hai ký tự đại diện ở Tuần 2 - Toán tử đặc biệt. Ôn tập nhanh:
| Ký tự đại diện | Ý nghĩa |
|---|---|
% | Đại diện cho một chuỗi ký tự bất kỳ, kể cả chuỗi rỗng (0, 1 hoặc nhiều ký tự) |
_ | Đại diện cho đúng một ký tự bất kỳ |
-- Bắt đầu bằng "Nguyễn"
WHERE HoTen LIKE N'Nguyễn%'
-- Kết thúc bằng "An"
WHERE HoTen LIKE N'%An'
-- Có chứa "Văn"
WHERE HoTen LIKE N'%Văn%'
-- Đúng 4 ký tự, bắt đầu "PB0" + 1 ký tự bất kỳ
WHERE MaPB LIKE 'PB0_'06 · ORDER BY & HÀM TỔNG HỢP
Sắp xếp sinh viên theo tên:
SELECT *
FROM SinhVien
ORDER BY HoTen ASC; -- Đổi thành DESC để sắp xếp giảm dầnCác hàm cần nhớ: COUNT(), SUM(), AVG(), MIN(), MAX(). Ví dụ có bao nhiêu sinh viên:
SELECT COUNT(*) AS SoLuongSinhVien
FROM SinhVien;07 · GROUP BY & HAVING
Đếm số sinh viên của từng lớp:
SELECT
MaLop,
COUNT(*) AS SoLuong
FROM SinhVien
GROUP BY MaLop;| MaLop | SoLuong |
|---|---|
| HTTT01 | 2 |
| HTTT02 | 1 |
Chỉ lấy những lớp có từ 2 sinh viên trở lên:
SELECT
MaLop,
COUNT(*) AS SoLuong
FROM SinhVien
GROUP BY MaLop
HAVING COUNT(*) >= 2;08 · ÔN TẬP JOIN
Đây là nội dung trọng tâm của tuần ôn tập. Muốn hiển thị Mã SV, Họ tên, Tên lớp:
SELECT
SV.MaSV,
SV.HoTen,
L.TenLop
FROM SinhVien SV
JOIN Lop L
ON SV.MaLop = L.MaLop;Chỉ lấy những bản ghi có quan hệ ở cả hai bảng - Nếu một lớp chưa có sinh viên, lớp đó không xuất hiện trong kết quả.
Hiển thị tất cả các lớp, kể cả lớp chưa có sinh viên - Đây là dạng câu hỏi sinh viên rất dễ gặp trong bài thực hành:
SELECT
L.MaLop,
L.TenLop,
SV.MaSV,
SV.HoTen
FROM Lop L
LEFT JOIN SinhVien SV
ON L.MaLop = SV.MaLop;Ví dụ có LOP ➜ SINHVIEN ➜ KETQUA ➜ MONHOC. Truy vấn sinh viên nào học môn nào và đạt bao nhiêu điểm:
SELECT
SV.MaSV,
SV.HoTen,
MH.TenMH,
KQ.Diem
FROM SinhVien SV
JOIN KetQua KQ
ON SV.MaSV = KQ.MaSV
JOIN MonHoc MH
ON KQ.MaMH = MH.MaMH;Đây là dạng truy vấn tổng hợp mà sinh viên cần thành thạo trước khi kết thúc phần thực hành.
09 · ÔN TẬP SUBQUERY
Tìm sinh viên có điểm lớn hơn điểm trung bình:
SELECT *
FROM KetQua
WHERE Diem > (
SELECT AVG(Diem)
FROM KetQua
);Tư duy:
10 · ÔN TẬP UPDATE & DELETE
Sửa tên sinh viên:
UPDATE SinhVien
SET HoTen = N'Nguyễn Văn Nam'
WHERE MaSV = 'SV001';UPDATE SinhVien SET HoTen = N'Nguyễn Văn Nam'; vì thiếu WHERE, câu lệnh này sẽ cập nhật toàn bộ sinh viên.DELETE FROM SinhVien
WHERE MaSV = 'SV001';Tương tự - Luôn kiểm tra WHERE trước khi DELETE.
11 · YÊU CẦU THỰC HÀNH
Bài thực hành chính thức của tuần này dùng lược đồ cổ điển "Nhà cung cấp - Phụ tùng - Vận chuyển" (Quản lý hàng hóa) - Schema, dữ liệu mẫu và toàn bộ 36 câu nằm trong trang bài tập bên dưới.
Xem đề bài đầy đủ và đáp án chi tiết (cần mã truy cập) cho bài ôn tập tổng hợp.
12 · BÀI TẬP THÁCH THỨC
Rèn luyện thêm với lược đồ Quản lý đào tạo (LOP, SINHVIEN, MONHOC, KETQUA) đã dùng xuyên suốt các mục lý thuyết ở trên - Không còn là bài thực hành chính thức, nhưng vẫn hữu ích để luyện phản xạ. Sinh viên khá/giỏi thực hiện thêm - Mỗi bài có gợi ý ẩn, bấm để mở.
Tìm sinh viên chưa học môn IS210.
Tìm những sinh viên có điểm tất cả các môn đều từ 5 trở lên.
Tìm sinh viên có điểm trung bình cao nhất.
Xếp hạng sinh viên theo điểm trung bình.
Tìm môn học có nhiều sinh viên đạt điểm dưới 5 nhất.
13 · CÁC LỖI THƯỜNG GẶP
-- Sai
JOIN Lop L ON SV.MaSV = L.MaLop
-- Đúng
JOIN Lop L ON SV.MaLop = L.MaLop-- Sai tư duy
WHERE COUNT(*) > 2
-- Đúng
GROUP BY MaLop
HAVING COUNT(*) > 2-- Sai
SELECT MaLop, COUNT(*)
FROM SinhVien;
-- Phải có GROUP BY
SELECT MaLop, COUNT(*)
FROM SinhVien
GROUP BY MaLop;Luôn kiểm tra bằng SELECT trước khi chạy UPDATE hoặc DELETE:
SELECT *
FROM SinhVien
WHERE MaSV = 'SV001';14 · CHECKLIST ÔN TẬP
Sinh viên tự đánh giá trước khi thi thực hành: