select name from students where sex='男' and score exists(select 1 from grade where)

exists这个条件就算成立了  返回的字段始终为1  若改为select 2 from grade 则返回字段2

exists子句不在乎返回什么  在乎是不是有结果集返回

 

exists和in最大的区别在于in引导的子句只能返回一个字段,exists返回的是一个结果集

 

not exists和not in 是exists和in的对立面

exists =》sql返回结果集为真     not exists=》sql不返回结果集为真

下面的栗子是拷贝别人的

如下:
表A
ID NAME  
1   A1
2   A2
3   A3

表B
ID AID NAME
1   1     B1
2   2     B2  
3   2     B3

表A和表B是1对多的关系 A.ID => B.AID

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID=B.AID)
执行结果为
1 A1
2 A2

NOT EXISTS 就是反过来
SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)

执行结果为
3 A3

 

exists和in意思一样,语法不同

select id,name from a where id in(select aid from b)

not exists=not in 意思相同,语法不同

select id,name from a where id not in(select aid from b)

下面再copy一个栗子

Id  Name  Class Count  Date

 1   苹果    水果    10     2011-7-1

 1   桔子    水果    20     2011-7-2

 1   香蕉    水果    15     2011-7-3

 2   白菜    蔬菜    12     2011-7-1

 2   青菜    蔬菜    19     2011-7-2

如果想要得到下面的结果:(Id唯一,Date选最近的一次)

1   香蕉    水果    15     2011-7-3

2   青菜    蔬菜    19     2011-7-2

正确的SQL语句是:

SELECT Id, Name, Class, Count, Date
FROM table t
WHERE (NOT EXISTS
          (SELECT Id, Name, Class, Count, Date FROM table 
         WHERE Id = t.Id AND Date > t.Date))

如果用distinct,得不到这个结果, 因为distinct是作用与所有列的

还有一种

select id,name,class,count,date from table t where (date=(select max(date) from table where id=t.id))