为什么我的 MySQL INNER JOIN 查询没有返回所有匹配的记录?

问题描述 投票:0回答:1

我正在尝试连接两个表(客户和订单)并检索客户名称及其订单 ID。但是,查询不会返回我期望的所有记录。这是我正在使用的查询

SELECT customers.name, orders.order_id
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id
WHERE customers.country = 'USA';

问题是-

我希望此查询返回所有来自美国的客户及其相关订单。但是,输出似乎缺少我知道某些客户的

orders
表中存在的一些订单。没有错误信息,但结果集不完整。

电流输出-

只有至少下过一份订单的顾客才会被退回。结果中缺少尚未下订单的美国客户。

预期结果-

我希望查询返回来自美国的所有客户以及他们在orders表中的

匹配的订单ID
,即使他们还没有下任何订单。

问题:

  1. 我是否应该使用不同类型的联接(例如,

    LEFT JOIN
    )来包含没有订单的客户?

  2. WHERE
    条款是否会影响
    JOIN
    行为,是否应该以不同方式进行过滤以包括来自美国的所有客户?

  3. 我如何修改此查询以确保列出所有来自美国的客户,即使他们没有订单?

sql mysql database join
1个回答
0
投票

您面临的问题是因为您使用的是 INNER JOIN,它仅返回两个表中匹配的行(即已下订单的客户)。这就是为什么结果中缺少未下订单的客户。

要包含来自美国的所有客户,即使是那些没有下过任何订单的客户,您也应该使用 LEFT JOIN 而不是 INNER JOIN。 LEFT JOIN将返回customers表中的所有记录,如果orders表中没有匹配的记录,则订单详细信息将返回为NULL。

选择客户.名称,订单.订单ID 来自客户 LEFT JOIN 订单位于customers.customer_id =orders.customer_id WHERE 客户.国家 = '美国';

LEFT JOIN 确保包含客户表中的所有客户,即使他们在订单表中没有任何匹配记录。 对于没有订单的客户,order_id 将返回 NULL,但客户的姓名仍会出现在结果集中。 此查询现在应返回所有美国客户,无论他们是否已下订单。

© www.soinside.com 2019 - 2024. All rights reserved.