ĐỀ 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?