嵌套子查询和关联子查询
嵌套子查询: 1. 内部查询只处理一次; 2. 与null比较,总得到null 3.先进行内部查询,然后再进行外部查询
关联子查询: 1. 外部查询得到的每天记录传入到内部查询; 2.内部查询基于外部查询传入的值; 3.内部查询从其结果中把值传回到外部查询,外部查询使用这些值来完成其处理。
外部查询返回较少记录时,关联子查询比嵌套子查询效果高;
内部查询返回较少记录时,嵌套子查询比关联子查询效果高.
in和exists
select * from A where cc in (select cc from B)
如果表A较大,那么in比exists的效率要高(可以用到B表上cc列的索引).
select * from A where exists (select cc from B where cc=A.cc)
如果表A较小,那么exists比in的效率要高(可以用到A表上cc列的索引)
not in 和not exists
如果查询语句使用了not
in 那么内外表都进行全表扫描,没有用到索引;
而not extsts 的子查询依然能用到表上的索引。
所以无论那个表大,用not exists都比not in要快。
======================================
|
select b.*, (select c.name from user_info c where c.id = b.owneruser) na, (select c.name from user_info c where c.id = b.createuser) name2, (select c.name from user_info c where c.id = b.updateuser) name from item_info b; from item_info b, user_info c, user_info d, user_info e where b.owneruser = c.id and b.createuser = d.id and b.updateuser = e.id |
跨库关联查询和跨库嵌套查询,跟据数据量和实际情况,可以相互替换,可能性能比较底
join换成in的也比较多,in的结果太多,导致传输sql太大,也可以在应用端join,这样连接次数比较多,foreach做法。
这时客户充当聚合或二次处理。
特别里的跨库是跨机等同,跨机嵌套子查询
关联子查询
本文介绍了嵌套子查询和关联子查询的区别与应用场景。嵌套子查询先执行内部查询,再执行外部查询,适合内部查询结果集小的情况。关联子查询则将外部查询的每条记录传递给内部查询,适用于外部查询记录少的情况。对于'in'和'exists'的使用,根据数据表大小选择合适的方式。在跨库查询中,根据数据量和需求,可以灵活选择嵌套查询或关联查询,并考虑在应用端处理以优化性能。
1925

被折叠的 条评论
为什么被折叠?



