SQL多表JOIN操作中,如何确定连接的左表?
如何确定SQL JOIN操作中的左表?
问题场景
在learnsql.com练习多表JOIN时,遇到三张表连接的左表选择困惑:
- 问题1:显示
dairy部门所有产品的名称及其热量值,从product表开始左连nutrition_data和department表,逻辑正确 - 问题2:列出所有热量低于150卡路里的产品,显示产品名(重命名为
product)和所属部门(重命名为department),沿用product表开始的逻辑不对,正确解法是从department表开始连接
核心判断逻辑
确定左表的关键是你的查询结果需要以哪个表的数据集为基础,按以下几点判断:
明确核心实体
先搞清楚你要查的核心对象是什么:- 如果核心是「产品」,就优先把
product作为起始表;如果核心是「部门」,就从department开始 - 比如问题2的核心是「热量不达标的产品」,理论上从
product表开始更符合直觉,但如果题目默认所有产品都属于某个部门,从department表用INNER JOIN连接也能得到相同结果(INNER JOIN的左右表顺序不影响最终输出)
- 如果核心是「产品」,就优先把
判断是否需要保留全量记录
如果你需要保留某张表的全部(或符合过滤条件的)记录,即使关联表中没有匹配数据,这张表必须放在LEFT JOIN的左侧:- 比如问题1如果要求「显示dairy部门的所有产品,哪怕该产品没有录入热量数据」,那
product表必须放在左边,用LEFT JOIN nutrition_data;如果只需要显示有热量数据的产品,用INNER JOIN的话,product和nutrition_data的顺序可以互换
- 比如问题1如果要求「显示dairy部门的所有产品,哪怕该产品没有录入热量数据」,那
结合过滤条件效率
如果过滤条件是针对某张表的,优先把该表作为起始表,先筛选数据再关联其他表,能减少后续关联的数据量,提升查询效率:- 比如问题1要过滤
dairy部门,先从department表筛选出该部门的记录,再关联product和nutrition_data,比从product表关联后再过滤部门名称的效率更高
- 比如问题1要过滤
补充说明
对于INNER JOIN(内连接),左右表的顺序不会影响最终的查询结果,只是执行计划可能有差异;但对于LEFT JOIN(左连接),左表的选择直接决定了哪些记录会被保留,这是核心区别。
内容的提问来源于stack exchange,提问作者giraffe_beard
相关产品推荐
相关产品推荐

