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

两道sql题:

1、用一条SQL语句查询出每门课都大于80分的学生姓名。

2、删除除了自动编号不同,其他都相同的学生冗余信息。

第一题数据如下:


分析:每门课都大于80分,就是说学生最低分数要大于80分,我们直观看只有"王五"这个学生每门课分数都在80分以上。

解决思路:这里需要用到聚合函数min(score),查询出最低分数大于80分的学生即可。使用了聚合函数,条件就需要使用having语句。

第一步,查询姓名,最低分数。


第二步,这里只能查询出最低分数的那个人。需要改进,根据用户名分组(group by name),这样就能查询出每个人的最低分数。


第三步,查询出了每个人的最低分数,我们只需要得到最低分数大于80的学生。通过having语句来筛选。


第四步,我们得到了"王五"的信息,满足我们的要求,但是不是最终的需求,最终的需求是得到每门课大于80分的学生姓名。这样,我们需要再嵌套一个语句,只得到姓名。


最终SQL:select name from (select name,min(score) from student group by name having min(scor

e)>80) stu;

第二题数据如下:


分析:直观的看,我们需要删除id=3的学生信息,因为这条信息和id=1的重复了。这里只是一个示例,实际可能会有很多这样的重复学生信息,我们需要通过语句来找到这些重复的信息,然后删除。

解决思路:直接找冗余的学生信息,是不可能的,我们需要改变思路,找到学生唯一信息,这样,剩下的就是学生冗余信息。这里需要用到not in,关键在于怎么找到学生唯一信息。

找唯一信息,我们知道可以通过distinct关键字,但是这里不符合这样的场景。

另外通过group by分组,可以得到唯一信息,这里需要对除了id编号之外,所有的字段分组。


这里再通过where id not in条件语句就能删除冗余学生信息了。


最终SQL:delete from student2 where id not in (select a.id from (select id from student2 group by no,name,coursename,courseno,score) a);


  • 59
    点赞
  • 212
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
### 回答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来查学生姓名,这是我们希望查询的内容。 需要注意的是,这种方法要求每个学生都必须修满了所有课程,如果有学生没修完全部课程或者有课程没有成绩,那么这种方法就不适用。另外,如果有多个学生都符合条件,那么会一起返回。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值