原题目
从课程表(课程号,课程名) 学生表(学号,年龄,性别,课程号,分数)中 查询出平均分大于60分的学生的学号及课程成绩
最初尝试
一开始不太会做,直接在网络上搜索答案,找到的却只有查询平均成绩大于60分的学生的学号和平均成绩这样的题目答案
SELECT
s_id,
AVG( s_score )
FROM
score
GROUP BY
s_id
HAVING
avg( s_score ) > 60
单表操作,而且还和题意有差别,但是基本的语句形式是搭好的了
假设在这里也使用单表操作
select
s.s_id ,
s.s_score
from
test2.student s
where
s_id in (
select
s.s_id
from
test2.student s
group by
s.s_id
having
avg(s.s_score) > 60);
结果虽然没有问题,但是结果由于缺少学科的名字,不知道某一学生分数对应的学科是什么,是不是应该把学科名也一并查询出来,不然题目给的学科表感觉有点多余了。。。
最终解决
尝试用正常处理方式拆解为两步处理(设学生表为student,课程表为course)
1.求平均分大于60分的学生的学号
select
s.s_id
from
student s
group by
s.s_id
having
avg(s.s_score) > 60;
2.求出一个学生的所有学科成绩(如:求01号学生的)
select
s.s_id,
c.c_name,
s.s_score
from
test2.course c
join
test2.student s
on
c.c_id = s.s_subjectNo
where
s.s_id = '01';
3.将两者组合得到最终结果
select
s.s_id,
c.c_name,
s.s_score
from
course c
join
student s
on
c.c_id = s.s_subjectNo
where
s.s_id in (
select
s.s_id
from
student s
group by
s.s_id
having
avg(s.s_score) > 60);
用例
结尾附上我用的建表语句,小伙伴们可以自行尝试
CREATE TABLE `Student`(
`s_id` VARCHAR(20),
`s_age` INT(11) NOT NULL DEFAULT 0,
`s_subjectNo` VARCHAR(11) NOT NULL DEFAULT '',
`s_sex` VARCHAR(10) NOT NULL DEFAULT '',
`s_score` VARCHAR(10) NOT NULL DEFAULT '',
PRIMARY KEY(`s_id`)
);
CREATE TABLE `Course`(
`c_id` VARCHAR(20),
`c_name` VARCHAR(20) NOT NULL DEFAULT '',
PRIMARY KEY(`c_id`)
);
insert into Student values('01' , 18 , '01' , '男','60');
insert into Student values('01' , 18 , '02' , '男','78');
insert into Student values('02' , 20 , '01' , '男','88');
insert into Student values('02' , 20 , '02' , '男','90');
insert into Student values('03' , 22 , '01' , '女','40');
insert into Student values('03' , 22 , '02' , '女','23');
insert into Student values('04' , 24 , '01' , '女','50');
insert into Student values('04' , 24 , '02' , '女','66');
insert into course values('01' , '语文');
insert into course values('02' , '数学');