版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
源表
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 | 英语 |
问题
- 用一条SQL语句查询每门课程都是大于80分的学生的姓名
- 查询“语文”课程比“数学”课程成绩高的学生的信息以及课程分数
- 查询平均成绩大于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 以及平均成绩