MySQL练习题
-
-
-
- 31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime)
- 32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
- 37、查询不及格的课程,并按课程号从大到小排列(有歧义)
- 38、查询课程编号为"01"且课程成绩在60分以上的学生的学号和姓名;
- 40、查询选修“张三”老师所授课程的学生中,成绩最高的学生姓名及其成绩
- 42、查询每门功课成绩最好的前两名
- 43、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
- 44、检索至少选修两门课程的学生学号
- 46、查询各学生的年龄
- 47、查询本周过生日的学生
- 48、查询下周过生日的学生
- 49、查询本月过生日的学生
- 50、查询下月过生日的学生
-
-
表结构预览
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/99846f0bd74cafab86cdbd3c7ce692f7.png)
31、查询1990年出生的学生名单(注:Student表中Sage列的类型是datetime)
SELECT sid, sname, year(sage) # 对datetime型数据的操作
from student
WHERE year(sage) = '1990'
32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
select cid, avg(score)
from sc
GROUP BY cid
ORDER BY avg(score), cid desc
37、查询不及格的课程,并按课程号从大到小排列(有歧义)
改为查询每位同学不及格的课程数(课程无法显示完全,由于分组),并按课程号从达到小排列
改为查询每个课程不及格的学生
select sid, cid, score
from sc
GROUP BY sid
having score < 60
ORDER BY cid desc
不明白的地方
SELECT * # 可以执行
from sc
GROUP BY sid
having score < 60
SELECT sid, count(*) # 为何无法正常执行???
from sc
GROUP BY sid
having score < 60 [Err] 1054 - Unknown column 'score' in 'having clause'
SELECT sid, count(*)
SELECT sid, count(score<60) # 结果为何和上句一致,为何无法进行过滤??
FROM sc
GROUP BY sid
SELECT sid, sum(IF(score<60,1,0)) # 结果正常,但是有的结果为0,想要过滤掉
FROM sc
GROUP BY sid
SELECT sid, count(*) # 实现了过滤功能,结果正确!
FROM sc
WHERE score < 60
GROUP BY sid
38、查询课程编号为"01"且课程成绩在60分以上的学生的学号和姓名;
方法一
SELECT s.sid, sname
from student s
join sc on sc.sid = s.sid
WHERE sc.score > 60 and sc.cid = '01'
方法二
SELECT s.sid, sname
FROM sc
#WHERE score > 60 and cid = '01' # JOIN必须要跟着表名
join student s
on s.sid = sc.sid
WHERE score > 60 and cid = '01' # 所以把where放在了最后
方法三
SELECT sid, sname from student