【每日一练:SQL】Oracle使用一个SQL查询出每门课程的成绩都大于80分的学生姓名

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/debimeng/article/details/87888830

Oracle使用一个SQL查询出每门课程的成绩都大于80分的学生姓名

SQL题:
使用一个SQL查询出每门课程的成绩都大于80分的学生姓名
表名为tb_grade,字段和数据如下
name    course        score
张三    语文        94
张三    数学        84
李四    语文        76
李四    数学        83
王五    语文        90
王五    数学        82
赵六    语文        66
赵六    数学        74
高俅    语文        96
高俅    数学        82

解决:
--创建表

create table tb_grade(name varchar2(20)
                      ,course varchar2(10)
                      ,score int);

--插入数据
 

insert into tb_grade values('张三','语文',94);
insert into tb_grade values('张三','数学',84);
insert into tb_grade values('李四','语文',76);
insert into tb_grade values('李四','数学',83);
insert into tb_grade values('王五','语文',90);
insert into tb_grade values('王五','数学',82);
insert into tb_grade values('赵六','语文',66);
insert into tb_grade values('赵六','数学',74);
insert into tb_grade values('高俅','语文',96);
insert into tb_grade values('高俅','数学',82);

--提交数据
 

commit;

方法一:
--对名字分组后,使用hving函数对每组最低分数大于80分

select name from tb_grade t
  group by t.name
  having min(t.score) > 80;

方法二:
--使用开窗函数统计出每个名字大于80分的科目数,然后再查询出等于2个科目的名字
 

select name
  from (select distinct name
               , count(name) over(partition by name) sco_num
          from tb_grade t
         where t.score > 80) a
 where a.sco_num = 2

方法三:
--逆向思维,如果有一科小于80分的,即不符合每科大于80分的
 

select distinct name
  from tb_grade a
 where a.name not in
       (select distinct t.name
          from tb_grade t
         where t.score < 81);

--或使用group替代distinct

select name
  from tb_grade a
 where a.name not in
       (select t.name
          from tb_grade t
         where t.score < 81
         group by t.name)
 group by name;

猜你喜欢

转载自blog.csdn.net/debimeng/article/details/87888830