exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:
select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1,如果改成“select
EXISTS检查是否有结果,判断是否有记录,返回的是一个布尔型(TRUE/FALSE)。
而 exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,比如:
select name from student where sex = 'm' and mark in (select 1,2,3 from grade where ...)
而not exists 和not in 分别是exists 和 in 的 对立面。
exists (sql 返回结果集为真)
not exists (sql 不返回结果集为真)
exists与in执行计划
exists:先执行外表,然后与内表去匹配。适合于外表小,内表大。
in:先执行内表,然后与外表去匹配。适合于外表大,内表小。
但在cbo中,内表外表顺序其实是有oracle根据成本控制了,整的来说exists由于它的设计,性能还是要好些。
下面详细描述not exists的过程:
如下:
表A
ID NAME
1
2
3
表B
ID AID NAME
1
2
3
表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
有时候我们会遇到要选出某一列不重复,某一列作为选择条件,其他列正常输出的情况.
如下面的表table:
Id
如果想要得到下面的结果:(Id唯一,Date选最近的一次)
1
2
正确的SQL语句是:
SELECT Id, Name, Class, Count, Date
FROM
WHERE (NOT EXISTS