前兩天去面試,面試官出了兩道很有意思的mysql題目,當時沒有寫出來,下來自己做的時候發現真的沒那么簡單,所以必須記錄下來。
現在有三個表
學生表 student
student_id ? ? ? ? ? ? student_name
課程表 course
course_id ? ? ? ? ? ? ?course_name
成績表 grades
student_id? ? ? ? ? ? ? course_id ? ? ? ? ? ? ? ?grade
題目一:找到所有每門課都及格的學生
思路:分組查找每個學生的最低分,過濾掉最低分小于60的同學
SELECT student.student_name AS pass_student, MIN(grades.grade) AS min_score
FROM student INNER JOIN grades ON student.student_id = grades.student_id
GROUP BY student.student_id
HAVING min_score >= 60;
題目二:找到每門課程的最高分對應的學生名字
思路:如果想要三表聯合查詢,以課程分組的最大值,學生姓名和課程名字的話,你會發現學生姓名是錯的,因為分組之后,學生姓名會變成該組第一個學生,而不是最高分對應的學生。
可行的查詢方法如下:
-- CREATE TABLE a AS
-- SELECT course.course_id, student_id, course_name, grade FROM
-- course INNER JOIN grades ON course.course_id = grades.course_id;
-- CREATE TABLE b AS
-- SELECT student.student_id, student_name, course_id,? course_name, grade
-- FROM a INNER JOIN student ON student.student_id = a.student_id;
/×在表b中找到分組后的最高分和對應的course_id, 然后在一個總表中查找對應最高分和course_id的student_name和course_name×/
SELECT b.course_name, b.student_name, b.grade AS max_score FROM b,
(SELECT course_id, MAX(grade) AS max_score FROM a GROUP BY course_id)c
WHERE b.course_id = c.course_id AND b.grade = c.max_score
這段代碼的麻煩之處是又重新建了兩個表,雖然說肯定會有更好的辦法,但懶得再想了,多學一陣再說吧