SQL中INNER JOIN和LEFT JOIN有什么区别

问答SQL中INNER JOIN和LEFT JOIN有什么区别
王利头 管理员 asked 2 年 ago
3 个回答
Mark Owen 管理员 answered 2 年 ago

在SQL中,JOIN语句用于从多个表中检索并组合数据。其中,INNER JOIN和LEFT JOIN是两种最常用的连接类型,它们之间的区别在于返回的结果集。

INNER JOIN

INNER JOIN联接两个表中具有匹配值的行。如果一个表中的行在另一个表中没有匹配值,则该行将从结果集中排除。

举个例子:

sql
SELECT *
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.id;

这个查询将联接orders表和customers表,并仅返回具有匹配customer_id值的订单和客户记录。如果某个订单没有相应的客户,它将不会出现在结果集中。

LEFT JOIN

LEFT JOIN联接两个表中的所有行,即使它们在另一个表中没有匹配值。如果没有匹配值,则结果集中相应字段的值将为空(通常表示为NULL)。

举例说明:

sql
SELECT *
FROM orders
LEFT JOIN customers
ON orders.customer_id = customers.id;

这个查询将联接orders表和customers表,并返回所有订单,即使它们没有相应的客户。对于没有匹配的订单,customers表中的字段将为NULL。

区别总结

| 特征 | INNER JOIN | LEFT JOIN |
|—|—|—|
| 返回的结果集 | 仅返回具有匹配值的记录 | 返回所有记录,即使没有匹配值 |
| 处理没有匹配值的记录 | 从结果集中排除 | 返回NULL值 |
| 用途 | 当需要联接只有匹配值的记录时 | 当需要联接所有记录,包括没有匹配值的记录时 |

选择合适的JOIN类型

选择合适的JOIN类型取决于要检索的数据类型。

  • 使用INNER JOIN:当您需要确保联接的记录具有匹配值时,例如查找特定客户下的所有订单。
  • 使用LEFT JOIN:当您需要返回所有记录,即使它们没有匹配值时,例如查找所有订单,包括未分配客户的订单。

示例:

假设我们有一个orders表和一个customers表,orders表包含一个customer_id列,链接到customers表中的primary key。

INNER JOIN:

sql
SELECT *
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.id
WHERE customers.name = 'John Doe';

这个查询将仅返回由名为“John Doe”的客户下的订单。

LEFT JOIN:

sql
SELECT *
FROM orders
LEFT JOIN customers
ON orders.customer_id = customers.id;

这个查询将返回所有订单,即使它们没有相应的客户。对于没有匹配客户的订单,customers表中的字段将为NULL。

seoer788 管理员 answered 2 年 ago

在 SQL 中,JOIN 操作是将不同表中的数据进行关联并合并的一种强大工具。其中,INNER JOIN 和 LEFT JOIN 是两种最常用的 JOIN 类型,它们的区别在于返回结果集的方式。

INNER JOIN

INNER JOIN 只返回两个表中具有匹配行的行。也就是说,它只包括那些在两个表的连接列上有相同值的记录。例如,下图展示了一个包含客户和订单表的数据库

“`
客户表:
| 客户ID | 客户姓名 |
|—|—|
| 1 | 约翰·史密斯 |
| 2 | 玛丽·约翰逊 |
| 3 | 迈克·琼斯 |

订单表:
| 订单ID | 客户ID | 产品 | 数量 |
|—|—|—|—|
| 10 | 1 | 笔记本电脑 | 1 |
| 11 | 1 | 键盘 | 2 |
| 12 | 2 | 鼠标 | 1 |
| 13 | 3 | 耳机 | 3 |
“`

如果使用 INNER JOIN 连接这两个表,则只返回具有匹配客户ID的记录:

sql
SELECT *
FROM 客户表
INNER JOIN 订单表
ON 客户表.客户ID = 订单表.客户ID;

结果集:


| 客户ID | 客户姓名 | 订单ID | 产品 | 数量 |
|---|---|---|---|---|
| 1 | 约翰·史密斯 | 10 | 笔记本电脑 | 1 |
| 1 | 约翰·史密斯 | 11 | 键盘 | 2 |
| 2 | 玛丽·约翰逊 | 12 | 鼠标 | 1 |

正如你所见,结果集中不包含客户 ID 为 3 的记录,因为在订单表中没有相应的订单。

LEFT JOIN

LEFT JOIN 返回两个表中的所有行,即使它们在连接列上不匹配。这意味着,它会为表中的每个行返回一条记录,即使该行在其他表中没有对应的匹配项。

使用上面的示例,如果我们使用 LEFT JOIN 连接客户表和订单表,则结果集将包括客户表中的所有三个客户,即使他们没有下过订单:

sql
SELECT *
FROM 客户表
LEFT JOIN 订单表
ON 客户表.客户ID = 订单表.客户ID;

结果集:


| 客户ID | 客户姓名 | 订单ID | 产品 | 数量 |
|---|---|---|---|---|
| 1 | 约翰·史密斯 | 10 | 笔记本电脑 | 1 |
| 1 | 约翰·史密斯 | 11 | 键盘 | 2 |
| 2 | 玛丽·约翰逊 | 12 | 鼠标 | 1 |
| 3 | 迈克·琼斯 | NULL | NULL | NULL |

在结果集中,客户 ID 为 3 的行包含 NULL 值,因为该客户在订单表中没有对应的订单。

什么时候使用 INNER JOIN 或 LEFT JOIN

INNER JOIN 和 LEFT JOIN 在 SQL 查询中都有其特定的用途:

  • INNER JOIN:当你想返回只有在两个表中都有匹配行的记录时,可以使用 INNER JOIN。例如,如果你想找出已下订单的客户,或者哪些产品已被售出。
  • LEFT JOIN:当你想返回来自一个表中的所有行,即使它们在另一个表中没有匹配行时,可以使用 LEFT JOIN。例如,如果你想找出所有客户的订单记录,即使一些客户没有下订单。

通过理解 INNER JOIN 和 LEFT JOIN 之间的区别,你可以有效地利用它们来从数据库中检索所需的数据。

ismydata 管理员 answered 2 年 ago

在 SQL 中,JOIN 是一种强大的工具,可以将来自不同表的记录组合起来。INNER JOIN 和 LEFT JOIN 是两种最常见的 JOIN 类型,它们在数据检索中的作用截然不同。

INNER JOIN

INNER JOIN 仅返回存在于两个表中的行。换句话说,它仅返回满足连接条件的匹配行。举例来说,假设我们有一个表存储客户信息(Customer),另一个表存储订单信息(Order),并且这两个表都包含一个 CustomerID 字段。

sql
SELECT *
FROM Customer
INNER JOIN Order
ON Customer.CustomerID = Order.CustomerID;

这个查询将返回所有同时存在于 Customer 和 Order 表中的行。如果某个客户没有下订单,或者某个订单属于不存在的客户,则不会返回该行。

LEFT JOIN

LEFT JOIN 与 INNER JOIN 类似,但它返回的是左表中所有的行,无论它们在右表中是否存在匹配行。换句话说,它返回左表中的所有行,即使它们不满足连接条件。

sql
SELECT *
FROM Customer
LEFT JOIN Order
ON Customer.CustomerID = Order.CustomerID;

这个查询将返回所有客户信息,即使他们没有下任何订单。对于没有匹配订单的客户,Order 表中的字段将显示为 NULL。

选择 INNER JOIN 还是 LEFT JOIN

选择使用 INNER JOIN 还是 LEFT JOIN 取决于所需的结果。

  • 使用 INNER JOIN 时:
    • 当你只对匹配的行感兴趣时。
    • 当你确定两个表之间存在匹配时。
  • 使用 LEFT JOIN 时:
    • 当你想返回左表中的所有行,即使它们没有匹配时。
    • 当你想显示左表中的数据,而右表中的数据可能不存在时。

举例说明

考虑这样一个场景:你想找出没有下过订单的客户。

  • INNER JOIN:

sql
SELECT *
FROM Customer
INNER JOIN Order
ON Customer.CustomerID = Order.CustomerID
WHERE Order.CustomerID IS NULL;

这个查询不会返回任何结果,因为它只包括同时存在于 Customer 和 Order 表中的行。没有下过订单的客户将被排除在外。

  • LEFT JOIN:

sql
SELECT *
FROM Customer
LEFT JOIN Order
ON Customer.CustomerID = Order.CustomerID
WHERE Order.CustomerID IS NULL;

这个查询将返回所有客户信息,包括没有下过订单的客户。Order 表中的字段对于没有匹配订单的客户将显示为 NULL。

总结

INNER JOIN 和 LEFT JOIN 是 SQL 中强大的工具,用于组合来自不同表的数据。INNER JOIN 仅返回匹配的行,而 LEFT JOIN 返回左表中的所有行,即使它们没有匹配。根据所需结果的不同,选择正确的 JOIN 类型至关重要。

公众号