mysql子查询与join的区别

两者区别:
思想上的区别:
子查询理解:①先知道需要查询并将数据拿出来(若from 后的表也是一个子查询结果)。②在去寻找满足判断条件的数据(where,on,having 后的参数等)。而这些查询条件通常是通过子查询获得的。
子查询是一种根据结果找条件的倒推的顺序。比较好理解与判断
例题中:“人物”在t_emp 表中,所以第一个from 是t_emp 表。(也可以直接将子查询方法 from 后面(因为本题中的子查询中也有select 的数据),所以任然需要上述的推导过程)
join理解:执行完第一步后的结果为一张新表。在将新表与 t_emp 进行下一步的 left join 关联。
先推出如何获得条件,再像算数题一样一步一步往下 join。可以交换顺序,但只能是因为条件间不相互关联时才能交换顺序。
join 比 子查询难一点 
join 能用到索引,但是子查询出来的表会使索引失效。
 
***求所有人物对应的掌门:
t_dept 表
id  deptName  address       CEO 
 1       华山派          华山          2
...
t_emp 表
id  name     age  deptId 
1  风清扬     90         1
...
1.使用子查询(不推荐,影响后续用索引)
步骤:a.创建子查询  查询出每个门派对应的ceo  
         b. 根据t_emp 对应的 deptId 关联子查询表查询出所有人物对应的 ceo
SELECT a.name,f.deptName,f.name FROM t_emp a
LEFT JOIN (SELECT d.`id`,e.`name` ,d.`deptName` FROM t_dept d
LEFT JOIN t_emp e 
ON d.`CEO`=e.`id`) f(f是没有索引的)
ON a.deptId = f.id
2.使用join(推荐)
步骤:a. 关联出每个人物对应的门派
       b.通过门派的 ceo 关联对应的掌门
SELECT e.`name`, d.`deptName`,f.`name` ceo FROM t_dept d
RIGHT JOIN t_emp e
ON d.`id` = e.`deptId`   ##第一步 --->得到关联了部门的一张新的联合表
LEFT JOIN t_emp f   
ON d.`CEO`=f.`id`       ##第二步  --->通过新的联合表中的数据与另一张表关联
 
SELECT d.`deptName`, e.`name` CEO,d.`id`,f.name
 FROM t_dept d
LEFT JOIN  t_emp e    //上述两个 join 交换了顺序并不影响执行。前提是两个 join 间不是依赖关系。且都跟
ON d.`CEO`=e.`id` 
LEFT JOIN t_emp f
ON f.deptId = d.`id`
 
 
若必须用到子查询,可将子查询设置为驱动表,,因为驱动表的type 肯定是 all,而子查询返回的结果表没有索引,必定也是all

你可能感兴趣的:(mysql高级)