日期:2014-05-16  浏览次数:20536 次

数据库sql语句的exists总结

数据库sql语句的exists总结 sql exists in 学习

?

先来比较下语法:

--deals=交易表,areas=地域表,例如香港;我们的目的:查看有交易的地域

select * from areas where id in (select city_id from deals);

select * from areas where?id?in? ?(select city_id from deals?where deals.city_id = areas.id);

select * from areas where exists (select null ? ? from deals where deals.city_id = areas.id);

区别:

EXISTS语法并没有说哪个字段落在了子查寻的结果中,而是说exists后面的语句执行的结果是不是有记录,只要有记录,则主查询语句就成立。它代表‘存在’,用来引领嵌套查询的子查询,它不返回任何数据,只产生逻辑真值‘true’与逻辑假值‘False’。由EXISTS引出的子查询,其目标列表达式通常都用*(用null也可以),因为带有EXISTS的子查询只返回真值或假值,给出列名没有实际意义。

?

性能变化的关键:
#1 执行的先后顺序
谁是驱动表,谁先执行查询,谁后执行查询
#2 执行过程
exists的优点是:只要存在就返回了,这样的话很有可能不需要扫描整个表。 ?
in需要扫描完整个表,并返回结果。
所以,在字表比较小的情况下,扫描全表和部分表基本没有差别;但在大表情况下,exists就会有优势。
看这两个语句:
--子查询会执行完全关联,并返回所有符合条件的city_id

select * from areas where?id?in? ?(select city_id from deals?where deals.city_id = areas.id);

--子查询的关联其实是一样的,但子查询只要查到一个结果,就返回了,所以效率还是比较高些的

?

select * from areas where?exists?(select null ? ? from deals where deals.city_id = areas.id);

#3 字表查询的结果
exists判断子查询的结果是不是存在,但查到什么结果,什么字段,并不关心;
in ? ? ?需要子查询查得的结果给主查询使用

?

in 和 Exists的用法区别
1.
EXISTS的执行流程????????
select * from t1 where?
exists?( select null from t2 where y = x )
可以理解为:
??? for x?
in?( select * from t1 )
??? loop
?????? if (?
exists?( select null from t2 where y = x.x )
?????? then?
????????? OUTPUT THE RECORD
?????? end if
??? end loop
对于in