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))