您的位置:

MySQL左连接的完整解读

一、Left Join概述

Left Join(左连接)是一种SQL语句的方式,主要用于从两个或多个表中拿取数据并链接在一起。左连接通常使用SELECT语句,它朝着左侧表(LEFT table)方向进行连接,而右侧表(RIGHT table)方向是可选的。当左表中没有匹配项时,返回的结果集中将包括左表中所有的记录,但是右表中的记录将被赋为 NULL 值。

Left Join 操作通常是针对两张或多张关联表进行查询,关联表通过一些共同属性将它们联系在一起,而且每张表都同时拥有一个唯一标识符 id。 Left Join 的结果就是通过这些公共属性,在表格上用组合的形式输出左表中满足条件的记录,并同时允许右表中的 NULL 值。


SELECT a.column1, b.column2, c.column3
FROM table1 a
LEFT JOIN table2 b ON a.id = b.id1
LEFT JOIN table3 c ON b.id2 = c.id
WHERE a.principal LIKE ‘John Smith’;

以上代码演示了在table1中以John Smith为首的记录,以及关联表格的操作。在这个例子中,大家可以发现,表格上的连接方式,就是通过一组 id 进行连接的, left join转换成 SQL 语句的形式,其过程其实是非常简单的,只需要根据 SQL 语句的书写规范,按部就班地书写,然后通过语句来连接表格,就能够实现 Left Join 操作了。

二、轻松理解Left Join的使用场景

由于 Left Join 可以在结果中返回左侧表的全部行,甚至不一定需要匹配的行,所以 Left Join 在对于非必须数据的关联查询时非常有效。一般情况下,会有这样一个比较常见的场景:对于已经存在的记录进行更新操作,更新需要在另外一个表格中获取数据,一般情况下,这种数据都偏向于非必须数据,因此,既然非必须,就可以利用Left Join 来进行关联查询。

举例来说,数据库中有两个表格,一张表格记录订单列表,包括订单号和订单名称等,另一张表格则记录了重量信息、成本信息等相关数据,包括表格订单 ID、实际成本等。有时候,当我们需要获取订单的详细信息时,需要将两份表格联合查询,例如获取最靠近昨天的订单成本信息。


SELECT orders.orderNo, orderdetails.actualCost
FROM orders
LEFT JOIN orderdetails
ON orders.orderNo = orderdetails.orderNo
WHERE orderdetails.dateCreated = DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY);

在上述 SQL 语句中,我们使用了 Left Join 操作符,连接了2张表格,并且使用 Left Join 来完成了关联数据的查询,也没有丢失订单列表中没有任何销售信息的记录。

三、Left Join的注意事项

在使用Left Join的时候,可能还会出现一些问题和注意事项:

1、顺序问题:

请注意表格之间的链接顺序,Left Join操作符联接的两张表格的联接顺序不可更改,因为一旦修改联接顺序,联接结果最终会发生改变。

2、性能问题:

在建立 Left Join 操作时,请确保保证系统性能,这就涉及到对于表格进行的优化工作。因为如果在数据量大的情况下,再大的性能问题不会出现在代码中,而是会出现在了数据库处理过程中。

3、where条件问题:

需要注意的是,where条件中可能需要对右侧表中的列过滤null值。


SELECT orders.orderNo, orderdetails.actualCost
FROM orders
LEFT JOIN orderdetails
ON orders.orderNo = orderdetails.orderNo AND orderdetails.actualCost IS NOT NULL
WHERE orders.dateCreated = DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY);

四、优秀范例

下面给大家推荐一个来自猿急用的优秀 Left Join 范例:


SELECT user.uid, user.name, stats.commentCount as comments
FROM user
LEFT JOIN (
    SELECT uid, COUNT(*) AS commentCount
    FROM comment
    WHERE createTime >= '2011-06-01' AND createTime < '2011-07-01'
    GROUP BY uid
) stats ON user.uid = stats.uid
WHERE user.registerTime < '2010-06-01'
ORDER BY stats.commentCount DESC;

以上SQL语句演示的是联合2张表格, user 和 comment,通过 Left Join 来完美获得所有的记录和统计信息。如果我们需要过滤掉不需要的记录,就直接在 where 后面加上条件过滤就好了,非常的方便。

五、小结

Left Join 是一个比较常见的SQL语句操作符,可以非常方便地从2张或者多张表格中获取数据、筛选出所需要的内容、建立起表格之间的关系,帮助我们完美完成自己的SQL语句编写操作。而在实际的开发过程中,有时候会遇到各种各样问题,例如顺序、性能、条件等等,我们需要根据具体情况进行调整和处理。