二、查詢「生物」課程比「物理」課程成績高的全部學生的學號; 思路: 獲取全部有生物課程的人(學號,成績) - 臨時表 獲取全部有物理課程的人(學號,成績) - 臨時表 根據【學號】鏈接兩個臨時表: 學號 物理成績 生物成績 而後再進行篩選 select A.student_id,sw,ty from (select student_id,num as sw from score left join course on score.course_id = course.cid where course.cname = '生物') as A left join (select student_id,num as ty from score left join course on score.course_id = course.cid where course.cname = '體育') as B on A.student_id = B.student_id where sw > if(isnull(ty),0,ty); 三、查詢平均成績大於60分的同窗的學號和平均成績; 思路: 根據學生分組,使用avg獲取平均值,經過having對avg進行篩選 select student_id,avg(num) from score group by student_id having avg(num) > 60 四、查詢全部同窗的學號、姓名、選課數、總成績; select score.student_id,sum(score.num),count(score.student_id),student.sname from score left join student on score.student_id = student.sid group by score.student_id 五、查詢姓「李」的老師的個數; select count(tid) from teacher where tname like '李%' select count(1) from (select tid from teacher where tname like '李%') as B 六、查詢沒學過「葉平」老師課的同窗的學號、姓名; 思路: 先查到「李平老師」老師教的全部課ID 獲取選過課的全部學生ID 學生表中篩選 select * from student where sid not in ( select DISTINCT student_id from score where score.course_id in ( select cid from course left join teacher on course.teacher_id = teacher.tid where tname = '李平老師' ) ) 七、查詢學過「001」而且也學過編號「002」課程的同窗的學號、姓名; 思路: 先查到既選擇001又選擇002課程的全部同窗 根據學生進行分組,若是學生數量等於2表示,兩門均已選擇 select student_id,sname from (select student_id,course_id from score where course_id = 1 or course_id = 2) as B left join student on B.student_id = student.sid group by student_id HAVING count(student_id) > 1 八、查詢學過「葉平」老師所教的全部課的同窗的學號、姓名; 同上,只不過將001和002變成 in (葉平老師的全部課) 九、查詢課程編號「002」的成績比課程編號「001」課程低的全部同窗的學號、姓名; 同第1題 十、查詢有課程成績小於60分的同窗的學號、姓名; select sid,sname from student where sid in ( select distinct student_id from score where num < 60 ) 十一、查詢沒有學全全部課的同窗的學號、姓名; 思路: 在分數表中根據學生進行分組,獲取每個學生選課數量 若是數量 == 總課程數量,表示已經選擇了全部課程 select student_id,sname from score left join student on score.student_id = student.sid group by student_id HAVING count(course_id) = (select count(1) from course) 十二、查詢至少有一門課與學號爲「001」的同窗所學相同的同窗的學號和姓名; 思路: 獲取 001 同窗選擇的全部課程 獲取課程在其中的全部人以及全部課程 根據學生篩選,獲取全部學生信息 再與學生錶鏈接,獲取姓名 select student_id,sname, count(course_id) from score left join student on score.student_id = student.sid where student_id != 1 and course_id in (select course_id from score where student_id = 1) group by student_id 1三、查詢至少學過學號爲「001」同窗全部課的其餘同窗學號和姓名; 先找到和001的學過的全部人 而後個數 = 001全部學科 ==》 其餘人可能選擇的更多 select student_id,sname, count(course_id) from score left join student on score.student_id = student.sid where student_id != 1 and course_id in (select course_id from score where student_id = 1) group by student_id having count(course_id) = (select count(course_id) from score where student_id = 1) 1四、查詢和「002」號的同窗學習的課程徹底相同的其餘同窗學號和姓名; 個數相同 002學過的也學過 select student_id,sname from score left join student on score.student_id = student.sid where student_id in ( select student_id from score where student_id != 1 group by student_id HAVING count(course_id) = (select count(1) from score where student_id = 1) ) and course_id in (select course_id from score where student_id = 1) group by student_id HAVING count(course_id) = (select count(1) from score where student_id = 1) 1五、刪除學習「葉平」老師課的score表記錄; delete from score where course_id in ( select cid from course left join teacher on course.teacher_id = teacher.tid where teacher.name = '葉平' ) 1六、向SC表中插入一些記錄,這些記錄要求符合如下條件:①沒有上過編號「002」課程的同窗學號;②插入「002」號課程的平均成績; 思路: 因爲insert 支持 inset into tb1(xx,xx) select x1,x2 from tb2; 全部,獲取全部沒上過002課的全部人,獲取002的平均成績 insert into score(student_id, course_id, num) select sid,2,(select avg(num) from score where course_id = 2) from student where sid not in ( select student_id from score where course_id = 2 ) 1七、按平均成績從低到高 顯示全部學生的「語文」、「數學」、「英語」三門的課程成績,按以下形式顯示: 學生ID,語文,數學,英語,有效課程數,有效平均分; select sc.student_id, (select num from score left join course on score.course_id = course.cid where course.cname = "生物" and score.student_id=sc.student_id) as sy, (select num from score left join course on score.course_id = course.cid where course.cname = "物理" and score.student_id=sc.student_id) as wl, (select num from score left join course on score.course_id = course.cid where course.cname = "體育" and score.student_id=sc.student_id) as ty, count(sc.course_id), avg(sc.num) from score as sc group by student_id desc 1八、查詢各科成績最高和最低的分:以以下形式顯示:課程ID,最高分,最低分; select course_id, max(num) as max_num, min(num) as min_num from score group by course_id; 1九、按各科平均成績從低到高和及格率的百分數從高到低順序; 思路:case when .. then select course_id, avg(num) as avgnum,sum(case when score.num > 60 then 1 else 0 END)/count(1)*100 as percent from score group by course_id order by avgnum asc,percent desc; 20、課程平均分從高到低顯示(現實任課老師); select avg(if(isnull(score.num),0,score.num)),teacher.tname from course left join score on course.cid = score.course_id left join teacher on course.teacher_id = teacher.tid group by score.course_id 2一、查詢各科成績前三名的記錄:(不考慮成績並列狀況) select score.sid,score.course_id,score.num,T.first_num,T.second_num from score left join ( select sid, (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 0,1) as first_num, (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 3,1) as second_num from score as s1 ) as T on score.sid =T.sid where score.num <= T.first_num and score.num >= T.second_num 2二、查詢每門課程被選修的學生數; select course_id, count(1) from score group by course_id; 2三、查詢出只選修了一門課程的所有學生的學號和姓名; select student.sid, student.sname, count(1) from score left join student on score.student_id = student.sid group by course_id having count(1) = 1 2四、查詢男生、女生的人數; select * from (select count(1) as man from student where gender='男') as A , (select count(1) as feman from student where gender='女') as B 2五、查詢姓「張」的學生名單; select sname from student where sname like '張%'; 2六、查詢同名同姓學生名單,並統計同名人數; select sname,count(1) as count from student group by sname; 2七、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列; select course_id,avg(if(isnull(num), 0 ,num)) as avg from score group by course_id order by avg asc,course_id desc; 2八、查詢平均成績大於85的全部學生的學號、姓名和平均成績; select student_id,sname, avg(if(isnull(num), 0 ,num)) from score left join student on score.student_id = student.sid group by student_id; 2九、查詢課程名稱爲「數學」,且分數低於60的學生姓名和分數; select student.sname,score.num from score left join course on score.course_id = course.cid left join student on score.student_id = student.sid where score.num < 60 and course.cname = '生物' 30、查詢課程編號爲003且課程成績在80分以上的學生的學號和姓名; select * from score where score.student_id = 3 and score.num > 80 3一、求選了課程的學生人數 select count(distinct student_id) from score select count(c) from ( select count(student_id) as c from score group by student_id) as A 3二、查詢選修「楊豔」老師所授課程的學生中,成績最高的學生姓名及其成績; select sname,num from score left join student on score.student_id = student.sid where score.course_id in (select course.cid from course left join teacher on course.teacher_id = teacher.tid where tname='張磊老師') order by num desc limit 1; 3三、查詢各個課程及相應的選修人數; select course.cname,count(1) from score left join course on score.course_id = course.cid group by course_id; 3四、查詢不一樣課程但成績相同的學生的學號、課程號、學生成績; select DISTINCT s1.course_id,s2.course_id,s1.num,s2.num from score as s1, score as s2 where s1.num = s2.num and s1.course_id != s2.course_id; 3五、查詢每門課程成績最好的前兩名; select score.sid,score.course_id,score.num,T.first_num,T.second_num from score left join ( select sid, (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 0,1) as first_num, (select num from score as s2 where s2.course_id = s1.course_id order by num desc limit 1,1) as second_num from score as s1 ) as T on score.sid =T.sid where score.num <= T.first_num and score.num >= T.second_num 3六、檢索至少選修兩門課程的學生學號; select student_id from score group by student_id having count(student_id) > 1 3七、查詢所有學生都選修的課程的課程號和課程名; select course_id,count(1) from score group by course_id having count(1) = (select count(1) from student); 3八、查詢沒學過「葉平」老師講授的任一門課程的學生姓名; select student_id,student.sname from score left join student on score.student_id = student.sid where score.course_id not in ( select cid from course left join teacher on course.teacher_id = teacher.tid where tname = '張磊老師' ) group by student_id 3九、查詢兩門以上不及格課程的同窗的學號及其平均成績; select student_id,count(1) from score where num < 60 group by student_id having count(1) > 2 40、檢索「004」課程分數小於60,按分數降序排列的同窗學號; select student_id from score where num< 60 and course_id = 4 order by num desc; 4一、刪除「002」同窗的「001」課程的成績; delete from score where course_id = 1 and student_id = 2