MySQL經典45題(二)
21. 查詢男生、女生人數
SELECT ssex,count(1) as 人數 from Student GROUP BY ssex
22. 查詢名字中含有「風」字的學生資訊
SELECT * FROM Student WHERE sname like '%風%'
23. 查詢同名同性學生名單,並統計同名人數
解題思路:按照姓名分組,姓名形同的情況下按照性別分組統計人數,如果統計人數大於等於1,那說明這個人就是同名同性的
SELECT sname,ssex,count(sname) FROM Student GROUP BY sname,ssex HAVING count(sname)>1
24. 查詢 1990 年出生的學生名單
SELECT * FROM Student WHERE year(sage)='1990'
25. 查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
SELECT cid,avg(score) as avg_score FROM SC GROUP BY cid ORDER BY avg_score DESC,cid ASC
26. 查詢平均成績大於等於 85 的所有學生的學號、姓名和平均成績
SELECT a.sid, b.sname, a.avg_score FROM (SELECT sid,avg(score) as avg_score FROM SC GROUP BY sid HAVING avg(score)>=85 ) a left join Student b on a.sid=b.sid
27. 查詢課程名稱為「數學」,且分數低於 60 的學生姓名和分數
SELECT b.sname, a.score FROM SC a left join Student b on a.sid=b.sid WHERE a.cid IN (SELECT cid FROM Course WHERE cname='數學') and a.score<60
28. 查詢所有學生的課程及分數情況(存在學生沒成績,沒選課的情況)
SELECT a.*,b.* FROM Student a left join SC b on a.sid=b.sid
29. 查詢任何一門課程成績在 70 分以上的姓名、課程名稱和分數
SELECT b.sname,c.cname,a.score FROM SC a LEFT JOIN Student b on a.sid=b.sid LEFT JOIN Course c on a.cid=c.cid WHERE a.score>70
30. 查詢不及格的課程
SELECT distinct cid FROM SC WHERE score<60
31. 查詢課程編號為 01 且課程成績在 80 分以上的學生的學號和姓名
SELECT a.sid,b.sname FROM (SELECT sid from SC where cid='01' and score>=80) a left JOIN Student b on a.sid=b.sid
32. 求每門課程的學生人數
select cid, count(1) as con from SC group by cid
33. 成績不重複,查詢選修「張三」老師所授課程的學生中,成績最高的學生資訊及其成績
解題思路:4張表連線起來,按成績排序降序,取第一條記錄,就是成績最高的
SELECT a.*,b.score FROM Student a INNER JOIN SC b on a.sid=b.sid INNER JOIN Course c on b.cid=c.cid INNER JOIN Teacher d on c.tid=d.tid WHERE d.Tname='張三' ORDER BY b.score desc LIMIT 1
34. 成績有重複的情況下,查詢選修「張三」老師所授課程的學生中,成績最高的學生資訊及其成績(Mysql版本太低,無法使用視窗函式,略)
35. 查詢不同課程成績相同的學生的學生編號、課程編號、學生成績(Mysql版本太低,無法使用視窗函式,略)
36. 查詢每門功成績最好的前兩名(Mysql版本太低,無法使用視窗函式,略)
37. 統計每門課程的學生選修人數(超過 5 人的課程才統計)。
SELECT cid,count(1) as cons FROM SC GROUP BY cid HAVING count(1)>5
38. 檢索至少選修兩門課程的學生學號
SELECT sid,count(1) as cons FROM SC GROUP BY sid HAVING count(1)>=2
39. 查詢選修了全部課程的學生資訊
SELECT * from Student where sid IN (select sid from SC GROUP BY sid HAVING COUNT(*)= (SELECT count(cid) FROM Course) )
40. 查詢各學生的年齡,只按年份來算
select *, year(NOW())-year(sage) as 年齡 from Student
41. 按照出生日期來算,當前月日 < 出生年月的月日則,年齡減一
select *, TIMESTAMPDIFF(YEAR,sage,NOW()) as 年齡 from Student
42. 查詢本週過生日的學生
select *,week(Sage),week(now()) from Student where week(Sage)=week(now());
43. 查詢下週過生日的學生
select *,week(Sage),week(now()) from Student where week(Sage)=week(now())+1;
44. 查詢本月過生日的學生
select *,month(Sage),month(now()) from Student where month(Sage)=month(now());
45. 查詢下月過生日的學生
select *,month(Sage),month(now()) from Student where month(Sage)=month(now())+1;