Thực hiện các truy vấn sau để xử lý dữ liệu đa bảng trong hệ thống cơ sở dữ liệu:
- Truy vấn 1: Lấy danh sách học viên có điểm thi lớn hơn 60, không trùng lặp
SELECT DISTINCT s.student_id, s.full_name
FROM students s
LEFT JOIN scores sc ON s.student_id = sc.student_id
WHERE sc.score_value > 60;
SELECT t.teacher_id, t.teacher_name, COUNT(t.teacher_id) AS course_count
FROM teachers t
LEFT JOIN courses c ON t.teacher_id = c.teacher_id
GROUP BY t.teacher_id;
SELECT s.*, cl.class_name
FROM students s
LEFT JOIN classes cl ON s.class_id = cl.class_id;
SELECT gender_type, COUNT(gender_type) AS count
FROM students
GROUP BY gender_type;
SELECT s.student_id, s.full_name, sc.score_value
FROM scores sc
LEFT JOIN students s ON sc.student_id = s.student_id
LEFT JOIN courses c ON sc.course_id = c.course_id
WHERE c.course_name = 'Sinh học';
SELECT s.student_id, AVG(sc.score_value) AS avg_score
FROM students s
LEFT JOIN scores sc ON s.student_id = sc.student_id
GROUP BY s.student_id;
SELECT COUNT(*) AS teacher_count
FROM teachers
WHERE teacher_name LIKE 'L%';
SELECT DISTINCT s.student_id AS student_code, s.full_name AS name
FROM scores sc
LEFT JOIN students s ON sc.student_id = s.student_id
WHERE sc.score_value < 60;
DELETE FROM scores
WHERE course_id = (
SELECT c.course_id
FROM courses c
INNER JOIN teachers t ON c.teacher_id = t.teacher_id
WHERE t.teacher_name = 'Trần'
);
SELECT c.course_id, MAX(sc.score_value) AS max_score, MIN(sc.score_value) AS min_score
FROM scores sc
JOIN courses c ON sc.course_id = c.course_id
GROUP BY c.course_id;
SELECT c.course_name, COUNT(sc.student_id) AS student_count
FROM courses c
LEFT JOIN scores sc ON c.course_id = sc.course_id
GROUP BY c.course_name;
SELECT * FROM students
WHERE full_name LIKE 'Trần%';
SELECT sc.course_id, AVG(sc.score_value) AS avg_score
FROM scores sc
GROUP BY sc.course_id
ORDER BY avg_score ASC, sc.course_id DESC;
SELECT s.student_id, s.full_name, AVG(sc.score_value) AS avg_score
FROM students s
LEFT JOIN scores sc ON s.student_id = sc.student_id
GROUP BY s.student_id
HAVING avg_score > 85;
SELECT s.student_id, s.full_name
FROM students s
JOIN scores sc ON s.student_id = sc.student_id
WHERE sc.course_id = 2 AND sc.score_value > 80;
SELECT c.course_name, COUNT(sc.student_id) AS student_count
FROM courses c
LEFT JOIN scores sc ON c.course_id = sc.course_id
GROUP BY c.course_name;
SELECT s.student_id, s.full_name
FROM students s
JOIN scores sc ON s.student_id = sc.student_id
WHERE sc.course_id = 1 AND sc.score_value < 70
ORDER BY sc.score_value DESC;
DELETE FROM scores
WHERE student_id = 2 AND course_id = 1;
Tạo bảng cấu trúc cơ sở dữ liệu:
CREATE TABLE classes (
class_id INT AUTO_INCREMENT PRIMARY KEY,
class_name VARCHAR(60) NOT NULL DEFAULT ''
) CHARSET utf8;
CREATE TABLE teachers (
teacher_id INT PRIMARY KEY,
teacher_name VARCHAR(60) NOT NULL DEFAULT ''
) CHARSET utf8;
CREATE TABLE students (
student_id INT PRIMARY KEY,
full_name VARCHAR(60) NOT NULL DEFAULT '',
gender_type ENUM('woman','man'),
class_id INT NOT NULL,
CONSTRAINT fk_student_class FOREIGN KEY (class_id) REFERENCES classes(class_id)
) CHARSET utf8;
CREATE TABLE courses (
course_id INT PRIMARY KEY,
course_name VARCHAR(60) NOT NULL,
teacher_id INT NOT NULL,
CONSTRAINT fk_course_teacher FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id)
) CHARSET utf8;
CREATE TABLE scores (
score_id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT NOT NULL,
course_id INT NOT NULL,
score_value INT NOT NULL,
CONSTRAINT fk_score_student FOREIGN KEY (student_id) REFERENCES students(student_id),
CONSTRAINT fk_score_course FOREIGN KEY (course_id) REFERENCES courses(course_id),
UNIQUE (score_value)
) CHARSET utf8;