多表查找最大/最小值對應的信息

前兩天去面試,面試官出了兩道很有意思的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


這段代碼的麻煩之處是又重新建了兩個表,雖然說肯定會有更好的辦法,但懶得再想了,多學一陣再說吧

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 50個常用的sql語句Student(S#,Sname,Sage,Ssex) 學生表Course(C#,Cname...
    哈哈海閱讀 1,256評論 0 7
  • 一、多表查詢 --編寫多表查詢語句的一般過程 --(1)、分析句子要涉及到哪些表 --(2)、對應的表中要查詢哪些...
    __71db閱讀 1,859評論 0 6
  • 說明:以下五十個語句都按照測試數據進行過測試,最好每次只單獨運行一個語句。 問題及描述: --1.學生表 Stud...
    lijun_m閱讀 1,329評論 0 1
  • 【Day3】從Odda輾轉到Lysebotn的青旅,我也在老司機的指導下開了段九曲十八彎的山路。 開隧道的時候,莫...
    Pinicilin閱讀 213評論 0 0
  • 一開始,我并沒有注意到他,他是大二的時候從另外一個學院轉過來的,好多同學說實在不明白他為何要來我們院,我承認我們院...
    張阿狗閱讀 394評論 0 0