+---------------------+---------+
| Column Name | Type |
+---------------------+---------+
| student_id | int |
| student_name | varchar |
+---------------------+---------+
student_id is the primary key (column with unique values) for this table.
student_name is the name of the student.
Table: Exam
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| exam_id | int |
| student_id | int |
| score | int |
+---------------+---------+
(exam_id, student_id) is the primary key (combination of columns with unique values) for this table.
Each row of this table indicates that the student with student_id had a score points in the exam with id exam_id.
A quiet student is the one who took at least one exam and did not score the highest or the lowest score.
Write a solution to report the students (student_id, student_name) being quiet in all exams. Do not return the student who has never taken any exam.
Input:
Student table:+-------------+---------------+| student_id | student_name |+-------------+---------------+|1| Daniel ||2| Jade ||3| Stella ||4| Jonathan ||5| Will |+-------------+---------------+Exam table:+------------+--------------+-----------+| exam_id | student_id | score |+------------+--------------+-----------+|10|1|70||10|2|80||10|3|90||20|1|80||30|1|70||30|3|80||30|4|90||40|1|60||40|2|70||40|4|80|+------------+--------------+-----------+Output:
+-------------+---------------+| student_id | student_name |+-------------+---------------+|2| Jade |+-------------+---------------+Explanation:
For exam 1: Student 1 and 3 hold the lowest and high scores respectively.For exam 2: Student 1 hold both highest and lowest score.For exam 3 and 4: Student 1 and 4 hold the lowest and high scores respectively.Student 2 and 5 have never got the highest or lowest in any of the exams.Since student 5is not taking any exam, he is excluded from the result.So, we only return the information of Student 2.
A student is quiet in all exams if they never scored the highest in any exam. For each exam, find the highest score, then for each student, check if they never had the highest score in any exam.
SELECT s.student_id, s.student_name
FROM Student s
WHERE s.student_id NOTIN (
SELECT e.student_id
FROM Exam e
JOIN (
SELECT exam_id, MAX(score) AS max_score
FROM Exam
GROUPBY exam_id
) m ON e.exam_id = m.exam_id AND e.score = m.max_score
)
ORDERBY s.student_id;
1
2
3
4
5
6
7
8
9
10
11
12
SELECT s.student_id, s.student_name
FROM Student s
WHERE s.student_id NOTIN (
SELECT e.student_id
FROM Exam e
JOIN (
SELECT exam_id, MAX(score) AS max_score
FROM Exam
GROUPBY exam_id
) m ON e.exam_id = m.exam_id AND e.score = m.max_score
)
ORDERBY s.student_id;