用一条SQL语句查询出每门课程的成绩都大于80的学生姓名

-- 用一条SQL语句查询出每门课程的成绩都大于80的学生姓名。Student表如下:
-- name  course	  score
-- 张三   语文		81
-- 张三	 数学		75
-- 李四	 语文		76
-- 李四	 数学		90
-- 王五	 语文		81
-- 王五	 数学 	   100
-- 王五	 英语		90

create table test1(
id int auto_increment,
name varchar(10),
course varchar(10),
score int,
primary key pk_test1(id)
)engine=InnoDB,charset=utf8mb4;
insert into test1 values
(0,'张三','语文',81),(0,'张三','数学',75),
(0,'李四','语文',76),(0,'李四','数学',90),
(0,'王五','语文',81),(0,'王五','数学',100),
(0,'王五','英语',90);
select * from test1;
#这道题有两种理解思路:
#第一种是出现在表里面的课程就是该人的所有课程,即张三李四在没有英语成绩下,两门都大于80也是算每门都大于80。
#用not in 或者 not exists 实现 第一种的写法 不过DISTINCT关键字尽量少用,效率太低
-- not in 
select distinct name from test1 where name not in 
(select distinct name from test1 where score < 80);
-- not exists
select distinct name from test1 a where not exists 
(select name from test1 b where score < 80 and a.name=b.name);
-- 效率比较高
select name from test1 group by name having min(score) >= 80;
#第二种是他们都有英语数学语文三门课程,没有出现在表的成绩要按0来算,即张三李四还有一门成绩为0的英语。
-- 效率高的写法
select name from test1 group by name having count(1) = 3 and min(score) >= 80;

 

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SELECT DISTINCT s.name FROM student s INNER JOIN score sc ON s.id = sc.student_id WHERE sc.score > 80 GROUP BY s.name HAVING COUNT(DISTINCT sc.course_id) = (SELECT COUNT(*) FROM course) ### 回答2: 要查询课都大于80分的学生姓名,需要涉及到成绩表和学生表。假设成绩表有以下字段:学生id(student_id)、课程id(course_id)和成绩(score),学生表有以下字段:学生id(id)和姓名(name)。 我们需要使用COUNT和GROUP BY语句查询每个学生的总课程数和总分数,而且只查询满足大于80分的学生,然后使用HAVING子句来筛选满足每课程成绩大于80分的学生。最后,我们需要将查询结果与学生表进行连接,以便获取学生姓名。 具体的SQL语句如下: SELECT s.name FROM student s INNER JOIN (SELECT student_id, COUNT(DISTINCT course_id) AS num_courses, SUM(score) AS total_score FROM score GROUP BY student_id HAVING MIN(score) > 80) sc ON s.id = sc.student_id WHERE num_courses = (SELECT COUNT(*) FROM course) 解释一下SQL语句:首先,我们在score表中对每个学生学生id分组,计算学生的总课程数和总分数(使用COUNT和SUM函数)。然后,我们将结果存放在一个内部查询中,并使用HAVING子句来筛选满足每课程成绩大于80分的学生。接着,我们将内部查询结果与学生表进行连接,最后在连接的结果集上使用WHERE子句,筛选满足总课程数等于课程数的学生(表示每课程都有成绩)。 总的来说,这个SQL语句相对复杂,但是可以通过对每个子句进行逐一解释,来理解查询的具体过程和实现。 ### 回答3: 要查询课都大于80分的学生姓名,需要对学生表和成绩表进行联合查询,并对成绩表进行分组和过滤,查询满足条件的学生姓名。 具体的SQL语句如下: ``` SELECT s.name FROM student s INNER JOIN score sc ON s.id = sc.student_id WHERE sc.score >= 80 GROUP BY s.id, s.name HAVING COUNT(*) = (SELECT COUNT(*) FROM course) ``` 解析: 1. 首先使用INNER JOIN将学生表和成绩表联合起来,以学生ID进行关联。 2. 然后使用WHERE条件语句过滤成绩大于等于80分的学生。 3. 接着使用GROUP BY对学生ID和姓名进行分组,确保每个学生现一次。 4. 使用HAVING COUNT(*)来过滤课都大于80分的学生姓名,COUNT(*)用于计算每个分组的行数,即学生所修课程数。 5. 最后使用SELECT来查学生姓名,这是我们希望查询的内容。 需要注意的是,这种方法要求每个学生都必须修满了所有课程,如果有学生没修完全部课程或者有课程没有成绩,那么这种方法就不适用。另外,如果有多个学生都符合条件,那么会一起返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值