MySQL左联接

时间:2019-11-20 08:52:05  来源:igfitidea点击:

简介:在本教程中,您将学习MySQL LEFT JOIN子句以及如何将其应用于从两个或多个表中查询数据。

MySQL LEFT JOIN简介

LEFT JOIN允许您从两个或多个表中查询数据。
与INNER JOIN子句类似,LEFT JOIN是SELECT语句的可选子句,它出现在FROM子句之后。

假设您要联接两个表t1和t2。

以下语句显示如何使用LEFT JOIN子句联接两个表:

SELECT 
    select_list
FROM
    t1
LEFT JOIN t2 ON 
    join_condition;

使用LEFT JOIN子句时,将介绍左表和右表的概念。

在以上语法中,t1是左表,t2是右表。

LEFT JOIN子句从左表(t1)开始选择数据。
它根据join_condition将左侧表(t1)中的每一行与右侧表(t2)中的每一行进行匹配。

如果两个表中的行导致联接条件的值为TRUE,则LEFT JOIN将两个表中的行的列合并为新行,并将此新行包括在结果行中。

如果左侧表(t1)中的行与右侧表(t2)中的任何行都不匹配,则LEFT JOIN仍将两个表中的行列合并为新行,并将新行包括在结果行中。
但是,它将右表中该行的所有列都使用NULL。

换句话说,LEFT JOIN返回左表中的所有行,而不管左表中的行是否与右表中的行匹配。
如果没有匹配项,则右表中该行的列将包含NULL。

以下维恩图可帮助您直观地了解LEFT JOIN子句的工作方式:

MySQL左联接–维恩图

MySQL LEFT JOIN示例

让我们举一些使用LEFT JOIN子句的示例。

1)使用MySQL LEFT JOIN子句联接两个表

请参阅下表中的示例数据库中的客户和订单。

每个客户可以拥有零个或多个订单,而每个订单必须属于一个客户。

此查询使用LEFT JOIN子句查找所有客户及其订单:

SELECT 
    customers.customerNumber, 
    customerName, 
    orderNumber, 
    status
FROM
    customers
LEFT JOIN orders ON 
    orders.customerNumber = customers.customerNumber;

另外,您可以使用表别名来保存一些键入内容:

SELECT
    c.customerNumber,
    customerName,
    orderNumber,
    status
FROM
    customers c
LEFT JOIN orders o 
    ON c.customerNumber = o.customerNumber;

在此示例中:

  • 客户是左表,订单是右表。

  • LEFT JOIN子句返回所有客户,包括没有订单的客户。
    如果客户没有订单,则orderNumber和status列中的值为NULL。

由于表客户和订单在连接条件中使用相等的运算符时都具有相同的列名(customerNumber),因此可以使用USING语法,如下所示:

SELECT
	customerNumber,
	customerName,
	orderNumber,
	status
FROM
	customers
LEFT JOIN orders USING (customerNumber);

以下子句是等效的:

USING (customerNumber)

ON c.customerNumber = o.customerNumber

如果用INNER JOIN子句替换LEFT JOIN子句,则将获得仅有至少一个订单的唯一客户。

2)使用MySQL LEFT JOIN子句查找不匹配的行

当您要查找表中没有其他表中匹配行的行时,LEFT JOIN子句非常有用。

以下示例使用LEFT JOIN查找没有订单的客户:

SELECT 
    c.customerNumber, 
    c.customerName, 
    o.orderNumber, 
    o.status
FROM
    customers c
LEFT JOIN orders o 
    ON c.customerNumber = o.customerNumber
WHERE
    orderNumber IS NULL;

3)使用MySQL LEFT JOIN联接三个表

请参阅以下三个表员工,客户和付款:

本示例使用两个LEFT JOIN子句来连接三个表:employee,customers和Payments。

SELECT 
    lastName, 
    firstName, 
    customerName, 
    checkNumber, 
    amount
FROM
    employees
LEFT JOIN customers ON 
    employeeNumber = salesRepEmployeeNumber
LEFT JOIN payments ON 
    payments.customerNumber = customers.customerNumber
ORDER BY 
    customerName, 
    checkNumber;

此图显示了部分输出:

这个怎么运作。

  • 第一个LEFT JOIN返回代表每个员工的所有员工和客户,如果该员工不负责任何客户,则返回NULL。

  • 第二个LEFT JOIN返回由雇员代表的每个客户的付款,如果客户没有付款,则返回NULL。

WHERE子句与ON子句中的条件

请参见以下示例。

SELECT 
    o.orderNumber, 
    customerNumber, 
    productCode
FROM
    orders o
LEFT JOIN orderDetails 
    USING (orderNumber)
WHERE
    orderNumber = 10123;

本示例使用LEFT JOIN子句从表orders和orderDetails查询数据。
查询返回订单及其订单号为10123的行项目。

但是,如果将条件从WHERE子句移到ON子句:

SELECT 
    o.orderNumber, 
    customerNumber, 
    productCode
FROM
    orders o
LEFT JOIN orderDetails d 
    ON o.orderNumber = d.orderNumber AND 
       o.orderNumber = 10123;

它将具有不同的含义。

在这种情况下,查询将返回所有订单,但只有订单10123将具有与其相关联的订单项,如下图所示:

注意,对于INNER JOIN子句,ON子句中的条件等同于WHERE子句中的条件。

在本教程中,您学习了如何使用MySQL LEFT JOIN子句连接来自两个或多个表的数据。