1. 程式人生 > 實用技巧 >MySQL經典45題(二)

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;