基于数据库中的成绩表:
成绩(学号,课程名,成绩)
用SQL语句写出只选修一门的学生的学号、课程名、成绩。
select * from 成绩表 where 学号 in
(
select 学号 from 成绩表 group by 学号 having count(课程名)=1
);
having称为分组滤过条件,也就是说是分组需要的条件,所以必须与group by联用
也就是说,聚合函数计算的结果可以当条件来使用,因为它无法放在where里,只能通过having这种方式来解决。
exists : 强调的是是否返回结果集,不要求知道返回什么。exists引导的子句有结果集返回,那么exists这个条件就算成立了。
exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,比如:
select * from 成绩 where sex = 'm' and mark in (select 1,2,3 from 成绩 where .)
,in子句返回了三个字段,这是不正确的,in只允许有一个字段返回.exists子句是允许的。
查找选修课程超过2门而且成绩都在80分以上的学生
select 学号 from 成绩表 where 成绩>80 and not exists
(
select 学号 from 成绩表 where 成绩<=80
)
group by 学号
having count(课程名)>2;