常见通用的join查询
2020 年 10 月 21 日 236 403 字 暂无评论

01.SQL执行顺序

1.1手写顺序

1.2机读顺序

  • 随着Mysql版本的更新换代,其优化器也在不断的升级,优化器会分析不同执行顺序产生的性能消耗不同而动态调整执行顺序。
  • 下面是经常出现的查询顺序:

1.3小结

02.join图

  • 共有:满足 a.deptid = b.id 的叫共有
  • A独有: A 表中所有不满足 a.deptid = b.id 连接关系的数据

03.7种join

1 A、B两表共有
 select * from t_emp a inner join t_dept b on a.deptId = b.id;
 
2 A、B两表共有+A的独有
 select * from t_emp a left join t_dept b on a.deptId = b.id;
 
3 A、B两表共有+B的独有
 select * from t_emp a right join t_dept b on a.deptId = b.id;
 
4 A的独有 
select * from t_emp a left join t_dept b on a.deptId = b.id where b.id is null; 
 
5 B的独有
 select * from t_emp a right join t_dept b on a.deptId = b.id where a.deptId is null;  
 
6 AB全有
#MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法
 #left join + union(可去除重复数据)+ right join
SELECT * FROM t_emp A LEFT JOIN t_dept B ON A.deptId = B.id
UNION
SELECT * FROM t_emp A RIGHT JOIN t_dept B ON A.deptId = B.id
 这里因为要联合的缘故,不能考虑到小表驱动大表的情况。只能用right join。要保证查询出来的数字要一致。
7 A的独有+B的独有
SELECT * FROM t_emp A LEFT JOIN t_dept B ON A.deptId = B.id WHERE B.`id` IS NULL
UNION
SELECT * FROM t_emp A RIGHT JOIN t_dept B ON A.deptId = B.id WHERE A.`deptId` IS NULL;

04.子查询和join理解

  • 子查询理解:

    • 先知道需要查询并将数据拿出来(若from后的表也是一个子查询结果)。
    • 在去寻找满足判断条件的数据(where,on,having后的参数等)。
    • 而这些查询条件通常是通过子查询获得的。
    • 子查询是一种根据结果找条件的倒推的顺序。比较好理解与判断
  • join理解:

    • 执行完第一步后的结果为一张新表。在将新表与 t_emp 进行下一步的 left join 关联。
    • 先推出如何获得条件,再像算数题一样一步一步往下join。可以交换顺序,但只能是因为条件间不相互关联时才能交换顺序。
  • join 比 子查询难一点
  • join 能用到索引,但是子查询出来的表会使索引失效。

版权属于:zfh

本文链接:http://zfhblog.com/index.php/archives/168/



评论已关闭