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;

 

posted @ 2020-12-16 15:45  优秀的进度条  阅读(2247)  评论(0编辑  收藏  举报