表A有某学校所有学生的姓名
表B有某学校所有的班级
要求通过班级查询所有学生的姓名
1)首先用in
查询姓名
select * from A where name in (select name from B);
该命令等价于
先走子查询 select name from B;
再走A表 select * from A where A.name=B.name;
它相当于一个大循环,嵌套着里面的一个小循环
其中子查询为外部循环,主查询语句是内部的循环
可以看出:
内表的结果无论如何都需要遍历(外层循环),这是不可避免的。
所以子查询A小于B,使用in
性能越好。
2)用exists
查询姓名
select * from A where exists ( select 1 from B where A.name=B.name );
该命令等价于:
先走表A select * from A;
再走表B select * from B where A.name=B.name;
它也是一个大循环嵌套一个内循环
不过,此处表A查询是外循环
可以看出:
外层表(A)的结果无论如何都需要遍历(外层循环),这是不可避免的。
所以A数据量大于B,使用exists
性能越好。
当A是外层循环(必须遍历),B是内层循环
A数据量小于B数据量,用in
A数据量大于B数据量,用exists
(此时B是外层循环)
一句话:选择外层循环表数据量小的。