Truy Vấn Đa Bảng Nâng Cao Trong Cơ Sở Dữ Liệu

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;
  • Truy vấn 2: Đếm số môn học do mỗi giảng viên phụ trách
  • 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;
  • Truy vấn 3: Lấy thông tin học viên cùng tên lớp
  • SELECT s.*, cl.class_name
    FROM students s
    LEFT JOIN classes cl ON s.class_id = cl.class_id;
  • Truy vấn 4: Đếm số học viên theo giới tính
  • SELECT gender_type, COUNT(gender_type) AS count
    FROM students
    GROUP BY gender_type;
  • Truy vấn 5: Tìm học viên học môn Sinh học
  • 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';
  • Truy vấn 6: Tính điểm trung bình của mỗi học viên
  • 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;
  • Truy vấn 7: Đếm giảng viên có tên bắt đầu bằng "L"
  • SELECT COUNT(*) AS teacher_count
    FROM teachers
    WHERE teacher_name LIKE 'L%';
  • Truy vấn 8: Lấy học viên có điểm dưới 60
  • 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;
  • Truy vấn 9: Xóa điểm học viên học môn của giảng viên "Trần"
  • 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'
    );
  • Truy vấn 10: Tìm điểm cao nhất và thấp nhất cho từng mô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;
  • Truy vấn 11: Đếm số học viên tham gia từng môn
  • 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;
  • Truy vấn 12: Tìm học viên tên bắt đầu bằng "Trần"
  • SELECT * FROM students
    WHERE full_name LIKE 'Trần%';
  • Truy vấn 13: Sắp xếp theo điểm trung bình mô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;
  • Truy vấn 14: Lấy học viên có điểm trung bình trên 85
  • 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;
  • Truy vấn 15: Tìm học viên môn 2 đạt trên 80 điểm
  • 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;
  • Truy vấn 16: Đếm số học viên theo môn học
  • 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;
  • Truy vấn 17: Học viên môn 1 dưới 70 điểm, sắp xếp theo điểm giảm dần
  • 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;
  • Truy vấn 18: Xóa điểm môn 1 của học viên số 2
  • 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;

Thẻ: mysql sql-joins aggregate-functions group-by multi-table-queries

Đăng vào ngày 29 tháng 7 lúc 11:36