这道SQL有一点...不一样?

114 阅读2分钟

原题目

从课程表(课程号,课程名) 学生表(学号,年龄,性别,课程号,分数)中 查询出平均分大于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);

结果虽然没有问题,但是结果由于缺少学科的名字,不知道某一学生分数对应的学科是什么,是不是应该把学科名也一并查询出来,不然题目给的学科表感觉有点多余了。。。

SQL1.png

最终解决

尝试用正常处理方式拆解为两步处理(设学生表为student,课程表为course)

1.求平均分大于60分的学生的学号

select
	s.s_id
from
	student s 
group by
	s.s_id
having
	avg(s.s_score)  > 60;

SQL2.png

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';

SQL3.png

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);

SQL4.png


用例

结尾附上我用的建表语句,小伙伴们可以自行尝试

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' , '数学');