MySQL LEFT JOIN应用

查找不匹配的行

当我们想要查找左表中与右表中的行不匹配的行时,LEFT JOIN子句非常有用,可以在SELELCT WHERE语句中添加一个子句,以仅查询右表中列值包含NULL值的行。

以下是示例用到的两个表:

  • orders表中的每个订单都必须属于customers表中的客户。
  • customers表中的每个客户可以在表中包含零个或多个订单orders。
+------------------------+
| customers              |
+------------------------+
| customerNumber         |
| customerName           |
| contactLastName        |
| contactFirstName       |
| phone                  |
| addressLine1           |
| addressLine2           |
| city                   |
| state                  |
| postalCode             |
| country                |
| salesRepEmployeeNumber |
| creditLimit            |
+------------------------+

+----------------+
| orders         |
+----------------+
| orderNumber    |
| orderDate      |
| requiredDate   |
| shippedDate    |
| status         |
| comments       |
| customerNumber |
+----------------+

如要查找尚未下订单的所有客户,可使用以下查询:

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子句中的条件

使用LEFT JOIN子句来查询orders和orderDetails表中的数据,查询返回订单号10123及其详细信息(如果有)。

+-----------------+
| orderdetails    |
+-----------------+
| orderNumber     |
| productCode     |
| quantityOrdered |
| priceEach       |
| orderLineNumber |
+-----------------+

SELECT 
    o.orderNumber, 
    customerNumber, 
    productCode
FROM
    orders o
        LEFT JOIN
    orderDetails USING (orderNumber) #这里相当于 ON o.oederNumber = orderDetails.orderNumber
WHERE
    orderNumber = 10123; 

+-------------+----------------+-------------+
| orderNumber | customerNumber | productCode |
+-------------+----------------+-------------+
|       10123 |            103 | S18_1589    |
|       10123 |            103 | S18_2870    |
|       10123 |            103 | S18_3685    |
|       10123 |            103 | S24_1628    |
+-------------+----------------+-------------+

但是,如果将条件从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        |
...

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数学是yyds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值