MySQL LEFT JOIN 子句
简介:在本教程中,您将了解MySQL LEFT JOIN子句以及如何将其应用于从两个或多个数据库表中查询数据。
MySQL LEFT JOIN 子句简介
MySQLLEFT JOIN
子句允许您查询来自两个或多个数据库表的数据。LEFT JOIN
子句是SELECT
语句的可选部分,出现在FROM
子句之后。
让我们假设你会从两个表中查询数据t1
和t2
。以下语句说明了LEFT JOIN
连接两个表的子句的语法:
SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM t1 LEFT JOIN t2 ON t1.c1 = t2.c1;使用
LEFT JOIN
子句将t1
表连接到t2
表,如果左表t1
中的行与t2
基于连接条件(t1.c1 = t2.c1
)的右表中的行匹配,则此行将包含在结果集中。
如果左表中的行与右表中的行不匹配,则还会选择左表中的行并将其与右表中的行组合其行中显示NULL
值。
换句话说,LEFT JOIN
子句允许您从左表和右表中选择匹配的行,以及左表(t1
)中的所有行,即使在右表(t2
)中找不到匹配的行也是如此。
以下可帮助您查看LEFT JOIN
子句的工作原理。两个圆之间的交集是在两个表中匹配的行,而左圆的剩余部分是t1
表中没有表中任何匹配行的行t2
。因此,左表中的所有行都包含在结果集中。
MySQL LEFT JOIN 实例
MySQL LEFT JOIN
子句连接两个表
我们来看看示例数据库中的customers
和orders
表。
+------------------------+ | customers | +------------------------+ | customerNumber | | customerName | | contactLastName | | contactFirstName | | phone | | addressLine1 | | addressLine2 | | city | | state | | postalCode | | country | | salesRepEmployeeNumber | | creditLimit | +------------------------+ 13 rows in set (0.01 sec) +----------------+ | orders | +----------------+ | orderNumber | | orderDate | | requiredDate | | shippedDate | | status | | comments | | customerNumber | +----------------+ 7 rows in set (0.01 sec)在上面的数据库图表中:
orders
表中的每个订单都必须属于customers
表中的客户。customers
表中的每个客户可以在表中包含零个或多个订单orders
。
LEFT JOIN
子句:
SELECT c.customerNumber, c.customerName, orderNumber, o.status FROM customers c LEFT JOIN orders o ON c.customerNumber = o.customerNumber;运行结果:
+----------------+------------------------------------+-------------+------------+ | customerNumber | customerName | orderNumber | status | +----------------+------------------------------------+-------------+------------+ | 103 | Atelier graphique | 10123 | Shipped | | 103 | Atelier graphique | 10298 | Shipped | | 103 | Atelier graphique | 10345 | Shipped | | 112 | Signal Gift Stores | 10124 | Shipped | | 112 | Signal Gift Stores | 10278 | Shipped | | 112 | Signal Gift Stores | 10346 | Shipped | | 114 | Australian Collectors, Co. | 10120 | Shipped | | 114 | Australian Collectors, Co. | 10125 | Shipped | ...因此,左表
customers
是所有客户都包含在结果集中。但是,结果集中有的行具没有订单数据,例如168,169等。这些行中的订单数据是NULL
。这意味着这些客户在orders
表中没有任何订单。
因为我们使用相同的列名(customerNumber
)来连接两个表,所以我们可以使用以下语法缩短查询:
SELECT c.customerNumber, customerName, orderNumber, status FROM customers c LEFT JOIN orders USING (customerNumber);在此脚本中使用有了以下语句
USING (customerNumber)相当于
ON c.customerNumber = o.customerNumber如果您用
LEFT JOIN
语句替换成INNER JOIN
,将获得已下订单的客户。
MySQL LEFT JOIN子句查找不匹配的行
当您想要查找左表中与右表中的行不匹配的行时,LEFT JOIN
子句非常有用。要查找两个表之间的不匹配行,可以WHERE
在SELECT
语句中添加一个子句,以仅查询右表中列值包含NULL
值的行。
例如,要查找尚未下订单的所有客户,请使用以下查询:
SELECT c.customerNumber, c.customerName, orderNumber, o.status FROM customers c LEFT JOIN orders o ON c.customerNumber = o.customerNumber WHERE orderNumber IS NULL;运行结果:
+----------------+--------------------------------+-------------+--------+ | customerNumber | customerName | orderNumber | status | +----------------+--------------------------------+-------------+--------+ | 125 | Havel & Zbyszek Co | NULL | NULL | | 168 | American Souvenirs Inc | NULL | NULL | | 169 | Porto Imports Co. | NULL | NULL | | 206 | Asian Shopping Network, Co | NULL | NULL | | 223 | Natrlich Autos | NULL | NULL | | 237 | ANG Resellers | NULL | NULL | | 247 | Messner Shopping Network | NULL | NULL | ...
WHERE子句与ON子句中的条件
请参阅以下示例。SELECT o.orderNumber, customerNumber, productCode FROM orders o LEFT JOIN orderDetails USING (orderNumber) WHERE orderNumber = 10123;在此示例中,我们使用
LEFT JOIN
子句来查询 orders
和 orderDetails
表中的数据。查询返回订单的订单及其详细信息(如果有)10123
。
运行结果:
+-------------+----------------+-------------+ | orderNumber | customerNumber | productCode | +-------------+----------------+-------------+ | 10123 | 103 | S18_1589 | | 10123 | 103 | S18_2870 | | 10123 | 103 | S18_3685 | | 10123 | 103 | S24_1628 | +-------------+----------------+-------------+ 4 rows in set (0.01 sec)但是,如果将条件从
WHERE
子句移动到ON
子句:
SELECT o.orderNumber, customerNumber, productCode FROM orders o LEFT JOIN orderDetails d ON o.orderNumber = d.orderNumber AND o.orderNumber = 10123;它会有不同的含义。 在这种情况下,查询将返回所有订单,但只有订单
10123
将具有与之关联的详细信息,如下所示。
运行结果:
+-------------+----------------+-------------+ | orderNumber | customerNumber | productCode | +-------------+----------------+-------------+ | 10123 | 103 | S18_1589 | | 10123 | 103 | S18_2870 | | 10123 | 103 | S18_3685 | | 10123 | 103 | S24_1628 | | 10298 | 103 | NULL | | 10345 | 103 | NULL | | 10124 | 112 | NULL | | 10278 | 112 | NULL | | 10346 | 112 | NULL | ...在本教程中,我们已经解释了MySQL
LEFT JOIN
子句,并向您展示了如何将其应用于查询来自多个数据库表的数据。