版权声明:本文为博主原创文章,未经博主允许不得转载。 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;