⽤⼀条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,关键在于怎么到学⽣唯⼀信息。
sql语句查询不包含唯⼀信息,我们知道可以通过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);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论