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

     创建表并初始化数据     

create table Grade
(
   Name nvarchar(20),
   Course nvarchar(10),
   Score int
)

insert Grade values('张三','语文',80)
insert Grade values('张三','数学',75)
insert Grade values('李四','语文',66)
insert Grade values('李四','数学',91)
insert Grade values('王五','语文',84)
insert Grade values('王五','数学',100)
insert Grade values('王五','英语',97)
insert Grade values('杨六','英语',86)
insert Grade values('杨六','数学',93)

   期望的结果为:王五和杨六。

     方法一  not in +子查询 :     

select distinct Name from Grade  where Name not in (select distinct Name from Grade where Score<=80)

   方法二 group by +聚合函数:

select Name from Grade group by Name having min(score)>80

   或另外一种方法适合学生所考的科目都一样的情况,但是此方法在这里无效。

select Name from Grade where Score>80 group by Name having count(Score)=3

  下面的几种方法也可以解题,但是不怎么好。

select distinct a.Name from Grade a left join Grade b on a.Name=b.Name and b.Score<=80 where b.Name is null

  或

select distinct Name from Grade a where not exists (select Name from Grade b where b.Score<=80 and b.Name=a.Name)

  或 

(select distinct Name from Grade) except (select distinct Name from Grade where Score<=80) 

  

 posted on 2014-05-07 20:07  会飞的金鱼  阅读(4219)  评论(1)    收藏  举报