相关子查询PK非相关子查询

相关子查询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、 得到最终结果


# 总结:相关子查询执行效率慢,数据越多,查询更费力,耗费存储也更多。非相关子查询内层只执行一次,效率更高。 (即使这样,相关子查询应用也较多,注意掌握)

你可能感兴趣的:(sql,mysql)