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子句,并向您展示了如何将其应用于查询来自多个数据库表的数据。
