源表
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 以及平均成绩
本文深入探讨了使用SQL进行复杂查询的方法,包括如何筛选所有课程分数超过80分的学生姓名,对比特定课程成绩并找出优秀学生,以及计算并筛选平均成绩高于65分的学生详情。
666

被折叠的 条评论
为什么被折叠?



