连表查询都用Left Join吧
Posted guogangj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连表查询都用Left Join吧相关的知识,希望对你有一定的参考价值。
最近看同事的代码,SQL连表查询的时候很多时候用的是Inner Join,而我觉得对我们的业务而言,99.9%都应该使用Left Join(还有0.1%我不知道在哪),我用最简单的方式来描述这两者的区别,直接看图(有点草啊):
我的做法是永远把查询主体放在左边,然后右边挨个连上要附加的信息,有则连上,没有则留null,这样思路是最清晰的。
Inner Join跟这个的区别是如果附加表找不到对应ID,那么这行记录就不会出现,我在图中用红色字体说明了这个区别。(各种Join的方式没有任何性能上的差别,只有功能上的差别)
另外一定一定要注意这几点:
- extra id这样的字段一定要指向附加表的主键。这并非SQL技术上的要求,而是我们业务逻辑的要求,如果指向的附加表的extra id不唯一,那极有可能带来你不想要的结果(通常是大量的重复),逻辑上也很难描述了。
- 如果附加表的extra id没有索引,将大大影响连表的效率。
- 如果想确保一定能带出附加信息,可以使用非空约束和外键约束。
我就简单这么定了:一定使用Left Join(除非你明确知道自己想要的是Inner Join),连表的列一定是指向另一张表的主键的。
以上是关于连表查询都用Left Join吧的主要内容,如果未能解决你的问题,请参考以下文章
一起来补课一文彻底搞懂Left JoinRight Join和Inner Join
Django ORM queryset object 解释(子查询和join连表查询的结果)
表的基本查询语句及使用连表(inner joinleft join)子查询