数据库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_idselect * 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 ? ? ?需要子查询查得的结果给主查询使用?
、用exists替代in(发现好多程序员不知道这个怎么用):??
?
R
R
R
+R
R
R