相关子查询PK非相关子查询:
1.非相关子查询:
例子:查询发票数大于2的客户的信息
select *
from client c
where client_id in(
seletc client_id,count(*)
from invoices
group by client_id
having count(*) > 2
)
执行流程:
1、 先执行括号里的子查询语句
2、 得到子查询的返回结果
3、 将子查询返回的结果作为外部查询的条件
4、 执行外部查询语句
5、 得到最终结果
相关子查询:
例子:查询出金额大于平均值(每个客户的发票金额平均值)的发票信息
select *
from invoices i
where i.total > (
seletc avg(total)
from invoice
where i.client_id = client_id
)
执行流程:
1、 从外层查询的表中获取相关的字段
2、 将从外层获取到的值供内层作为条件进行查询
3、 外层再根据内层返回的结果进行查询
4、 得到最终结果
# 总结:相关子查询执行效率慢,数据越多,查询更费力,耗费存储也更多。非相关子查询内层只执行一次,效率更高。 (即使这样,相关子查询应用也较多,注意掌握)