ĐỀ TEST SQL – CHỦ ĐỀ: QUẢN LÝ Y TẾ
Thời gian làm bài: 90 phút
🎯 Mục tiêu đánh giá:
- Viết SQL chính xác
- Hiểu nghiệp vụ y tế
- Phát hiện dữ liệu bất thường
- Tư duy kiểm thử dữ liệu
I. MÔ TẢ HỆ THỐNG & CSDL
Giả định DB: MySQL / PostgreSQL
1️⃣ Bảng patients
patients (
id BIGINT PRIMARY KEY,
patient_code VARCHAR(20),
full_name VARCHAR(100),
gender VARCHAR(10),
date_of_birth DATE,
phone VARCHAR(20),
status VARCHAR(20),
created_at TIMESTAMP
)
2️⃣ Bảng doctors
doctors (
id BIGINT PRIMARY KEY,
doctor_code VARCHAR(20),
full_name VARCHAR(100),
specialty VARCHAR(100),
department VARCHAR(100),
status VARCHAR(20)
)
3️⃣ Bảng appointments
appointments (
id BIGINT PRIMARY KEY,
patient_id BIGINT,
doctor_id BIGINT,
appointment_date DATE,
appointment_time TIME,
status VARCHAR(20)
)
4️⃣ Bảng medical_records
medical_records (
id BIGINT PRIMARY KEY,
patient_id BIGINT,
doctor_id BIGINT,
diagnosis TEXT,
visit_date DATE,
note TEXT
)
5️⃣ Bảng prescriptions
prescriptions (
id BIGINT PRIMARY KEY,
medical_record_id BIGINT,
medicine_name VARCHAR(100),
dosage VARCHAR(50),
days INT
)
II. PHẦN A – SQL CƠ BẢN
⏱ Thời gian gợi ý: 35–40 phút
Câu 1: Danh sách bệnh nhân đang hoạt động
Lấy patient_code, full_name, gender, status của bệnh nhân có status = 'active'.
Câu 2: Lịch hẹn khám và bác sĩ
Liệt kê patient_code, patient_name, doctor_name, specialty, appointment_date, status.
Câu 3: Số lượng bác sĩ theo khoa
Thống kê số lượng bác sĩ theo department.
Câu 4: Lịch sử khám của bệnh nhân
Với patient_code = 'BN001', liệt kê visit_date, doctor_name, diagnosis.
Câu 5: Số lượt khám của mỗi bệnh nhân
Đếm số bản ghi medical_records của từng bệnh nhân.
III. PHẦN B – SQL NÂNG CAO
⏱ Thời gian gợi ý: 50–55 phút
Câu 6: Bệnh nhân chưa từng đi khám
Liệt kê bệnh nhân không có bản ghi trong medical_records.
Câu 7: Bác sĩ có lịch hẹn bị hủy
Liệt kê bác sĩ có ít nhất 1 lịch hẹn status = 'canceled'.
Câu 8: Bác sĩ khám nhiều bệnh nhân nhất
Tìm bác sĩ có số lượt khám nhiều nhất.
Câu 9: Lần khám gần nhất của mỗi bệnh nhân
Lấy patient_code, last_visit_date, doctor_name, diagnosis.
Câu 10: Phát hiện dữ liệu bất thường
Liệt kê appointments có patient_id không tồn tại và prescriptions có medical_record_id không tồn tại.
Câu 11 (Bonus): Tư duy hệ thống
1. Nên index những cột nào?
2. Vì sao không nên lưu tổng số lượt khám trong bảng patients?