SQL校招社招刷题系列之学生成绩信息查询

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/liuzuoping/article/details/102155589

源表

s表

Sid :学生id
Sname :学生姓名

Sid Sname
1 赵雷
2 钱电
3 孙风
4 李云
5 周梅
6 吴兰
7 郑竹

sc表

Sid 学生id
Cid 课程id
score 分数

Sid Cid score
1 1 80
1 2 90
1 3 99
2 1 70
2 2 60
2 3 80
3 1 80
3 2 80
3 3 80
4 1 50
4 2 30
4 3 20
5 1 76
5 2 87
6 1 31
6 3 34
7 2 89

c表

Cid 课程id
Cname 课程名称

Cid Cname
1 语文
2 数学
3 英语

问题

  1. 用一条SQL语句查询每门课程都是大于80分的学生的姓名
  2. 查询“语文”课程比“数学”课程成绩高的学生的信息以及课程分数
  3. 查询平均成绩大于65分的学生的id和姓名以及平均成绩

问题一的解答

SELECT s.Sid,s.Sname 
FROM xiaoliu.s
INNER JOIN
xiaoliu.sc
ON sc.Sid=s.Sid
GROUP BY sc.Sid,s.Sname
HAVING MIN(sc.score)>80;

思路解析:因为要查询每门课程都是大于80分的学生的姓名,所以要联结包含学生姓名的和学号的 s 表和包含课程成绩的 sc 表,根据这两个表共同含有的Sid也就是学号来联结,最后再 group by 并且加 where 过滤。

问题二的解答

SELECT t1.Sid,t1.score AS '语文',t2.score AS '数学'
FROM
(SELECT Sid,score FROM xiaoliu.sc
INNER JOIN
xiaoliu.c
ON c.Cid=sc.Cid
WHERE c.Cname='语文') t1
INNER JOIN
(SELECT Sid,score FROM xiaoliu.sc
INNER JOIN
xiaoliu.c
ON c.Cid=sc.Cid
WHERE c.Cname='数学') t2
ON t1.Sid=t2.Sid
WHERE t1.score>t2.score;

思路解析:因为查询“语文”课程比“数学”课程成绩高的学生的信息以及课程分数,所以返回的还是学生的信息以及课程分数,即Sid ,语文成绩, 数学成绩,所以要做两张表分别查询学生的语文成绩和数学成绩即 t1 和 t2 。再根据学号相同来内连接这两张表,并且根据WHERE t1.score>t2.score这个过滤条件得到“语文”课程比“数学”课程成绩高的学生的信息以及课程分数

问题三的解答

SELECT s.Sid,s.Sname,AVG(sc.score) AS '平均成绩'
FROM 
xiaoliu.s
INNER JOIN
xiaoliu.sc
ON s.Sid=sc.Sid
GROUP BY s.Sid,s.Sname
HAVING AVG(sc.score)>65;

思路解析:因为要查询平均成绩大于65分的学生的id和姓名以及平均成绩,所以同样要根据学号相同来联结包含学生姓名的和学号的 s 表和包含课程成绩的 sc 表,并且根据平均成绩大于65来选出 Sid 和 Sname 以及平均成绩

猜你喜欢

转载自blog.csdn.net/liuzuoping/article/details/102155589