Sivo 悉见

mysql left join和inner join的区别,请用示例说明

匿名 · 更新于 2023/3/16

MySQL的LEFT JOIN和INNER JOIN都是关联查询,但是两者的作用不同。

LEFT JOIN:左连接,返回左表中所有记录和右表中匹配上的记录。如果右表没有匹配上,则显示NULL值。

INNER JOIN:内连接,只返回左右表中都匹配上的记录。

下面用例子来说明:

假设有两个表:

学生表:

id name sex age
1 Tom 20
2 Lucy 18
3 John 19
4 Alice 20
5 Jack 22

课程表:

id course score
1 语文 85
2 数学 90
3 英语 80
4 物理 70
5 化学 95
  1. LEFT JOIN

查询学生表和课程表,以学生表为主表,显示学生姓名、性别、语文成绩。

SELECT s.name, s.sex, c.score
FROM 学生表 s
LEFT JOIN 课程表 c ON s.id = c.id AND c.course = '语文';

结果:

name sex score
Tom 85
Lucy NULL
John NULL
Alice NULL
Jack NULL

分析:

左表为学生表,右表为课程表,LEFT JOIN连接条件为s.id=c.id,即学生表和课程表中id相等的记录进行连接。并且要求课程表中course为’语文’,这个条件放在ON子句中。

结果中只有Tom一条记录匹配上,其他的学生因为没有对应的语文成绩而显示NULL值。

  1. INNER JOIN

查询学生表和课程表,以学生表为主表,显示学生姓名、性别、语文成绩。

SELECT s.name, s.sex, c.score
FROM 学生表 s
INNER JOIN 课程表 c ON s.id = c.id AND c.course = '语文';

结果:

name sex score
Tom 85

分析:

INNER JOIN连接条件为s.id=c.id,即学生表和课程表中id相等的记录进行连接。并且要求课程表中course为’语文’,这个条件放在ON子句中。

由于只有Tom这条记录同时满足条件,因此只返回一条记录。

 


 

MySQL中的左连接(left join)和内连接(inner join)都是用于连接两个或多个表的操作,但是它们的连接方式和结果不同。

首先,让我们看一下内连接的示例:

假设我们有两个表:orderscustomers,其中orders表记录了订单信息,包括订单号、日期、客户ID和订单金额,customers表记录了客户信息,包括客户ID、姓名和地址。我们可以使用内连接语句来获取所有已下订单的客户信息,如下所示:

SELECT orders.order_id, orders.order_date, customers.customer_name
FROM orders INNER JOIN customers
ON orders.customer_id = customers.customer_id;

这个语句中的INNER JOIN表示使用内连接,ON后面的条件指定了连接的关键字。这个查询会返回一个结果集,其中包含了所有已下订单的客户信息,如下所示:

order_id | order_date | customer_name
-------------------------------------
1001     | 2022-01-01 | John Smith
1002     | 2022-01-02 | Jane Doe
1003     | 2022-01-03 | John Smith
1004     | 2022-01-04 | Jane Doe

现在,我们来看一下左连接的示例:

假设我们修改一下上面的查询,想要获取所有客户的订单信息,包括没有下订单的客户。我们可以使用左连接语句,如下所示:

SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers LEFT JOIN orders
ON customers.customer_id = orders.customer_id;

这个语句中的LEFT JOIN表示使用左连接,它将会返回所有客户的信息,即使没有对应的订单。这个查询会返回一个结果集,其中包含了所有客户的订单信息,如下所示:

customer_name | order_id | order_date
-------------------------------------
John Smith    | 1001     | 2022-01-01
Jane Doe      | 1002     | 2022-01-02
John Smith    | 1003     | 2022-01-03
Jane Doe      | 1004     | 2022-01-04
Mary Jones    | NULL     | NULL

可以看到,左连接返回了所有客户的信息,包括Mary Jones,即使她没有下过订单。对于那些没有对应订单的客户,order_idorder_date列的值为NULL

综上所述,内连接只返回有对应关系的行,而左连接返回左表中所有行和右表中对应的行,如果没有对应的行,则用NULL填充。

 


 

MySQL中的LEFT JOIN和INNER JOIN是用于连接两个或多个表的操作符。它们的区别在于:

  • LEFT JOIN返回左侧表的所有行和右侧表中匹配行的组合,如果右侧表中没有匹配的行,则返回NULL值。
  • INNER JOIN只返回左右两个表中都存在的行的组合。

以下是一个示例:

假设我们有两个表:order表和customer表,其中order表包含有关订单的信息,customer表包含有关客户的信息。两个表可以通过共同的customer_id列进行连接。

order表:

order_id customer_id order_date
1 101 2021-01-01
2 102 2021-01-02
3 103 2021-01-03
4 101 2021-01-04

customer表:

customer_id customer_name phone_number
101 Alice 555-1234
102 Bob 555-2345
104 Charlie 555-3456

现在我们将使用LEFT JOIN和INNER JOIN来查找order表和customer表之间的关联。查询如下:

  • LEFT JOIN:
SELECT *
FROM order
LEFT JOIN customer
ON order.customer_id = customer.customer_id;

结果:

order_id customer_id order_date customer_id customer_name phone_number
1 101 2021-01-01 101 Alice 555-1234
2 102 2021-01-02 102 Bob 555-2345
3 103 2021-01-03 NULL NULL NULL
4 101 2021-01-04 101 Alice 555-1234

在这里,我们使用了LEFT JOIN,因此我们可以看到order表中的所有四行都被返回,即使其中两行没有匹配的customer_id。 在这种情况下,使用LEFT JOIN很有用,因为它允许我们查找order表中的所有行,即使它们没有对应的customer表中的行。

  • INNER JOIN:
SELECT *
FROM order
INNER JOIN customer
ON order.customer_id = customer.customer_id;

结果:

order_id customer_id order_date customer_id customer_name phone_number
1 101 2021-01-01 101 Alice 555-1234
2 102 2021-01-02 102 Bob 555-2345
4 101 2021-01-04 101 Alice 555-1234

在这里,我们使用了INNER JOIN,因此只返回了左右两个表中都存在的行的组合。 结果中只有三行,因为order表中有一行没有匹配的customer_id,因此被排除在结果之外。

因此,LEFT JOIN和INNER JOIN的区别在于它们如何处理没有匹配值的行。LEFT JOIN将返回左侧表的所有行,即使它们没有匹配的右侧表中的行,而INNER JOIN只返回左右两个表中都存在的行的组合。

 



MySQL的LEFT JOIN和INNER JOIN是用于连接两个或多个表的操作符。它们的区别在于:

  • LEFT JOIN返回左侧表的所有行和右侧表中匹配行的组合,如果右侧表中没有匹配的行,则返回NULL值。
  • INNER JOIN只返回左右两个表中都存在的行的组合。

以下是一个示例:

假设我们有两个表:order表和customer表,其中order表包含有关订单的信息,customer表包含有关客户的信息。两个表可以通过共同的customer_id列进行连接。

order表:

order_id customer_id order_date
1 101 2021-01-01
2 102 2021-01-02
3 103 2021-01-03
4 101 2021-01-04

customer表:

customer_id customer_name phone_number
101 Alice 555-1234
102 Bob 555-2345
104 Charlie 555-3456

现在我们将使用LEFT JOIN和INNER JOIN来查找order表和customer表之间的关联。查询如下:

  • LEFT JOIN:
SELECT *
FROM order
LEFT JOIN customer
ON order.customer_id = customer.customer_id;

结果:

order_id customer_id order_date customer_id customer_name phone_number
1 101 2021-01-01 101 Alice 555-1234
2 102 2021-01-02 102 Bob 555-2345
3 103 2021-01-03 NULL NULL NULL
4 101 2021-01-04 101 Alice 555-1234

在这里,我们使用了LEFT JOIN,因此我们可以看到order表中的所有四行都被返回,即使其中两行没有匹配的customer_id。 在这种情况下,使用LEFT JOIN很有用,因为它允许我们查找order表中的所有行,即使它们没有对应的customer表中的行。

  • INNER JOIN:
SELECT *
FROM order
INNER JOIN customer
ON order.customer_id = customer.customer_id;

结果:

order_id customer_id order_date customer_id customer_name phone_number
1 101 2021-01-01 101 Alice 555-1234
2 102 2021-01-02 102 Bob 555-2345
4 101 2021-01-04 101 Alice 555-1234

在这里,我们使用了INNER JOIN,因此只返回了左右两个表中都存在的行的组合。 结果中只有三行,因为order表中有一行没有匹配的customer_id,因此被排除在结果之外。

因此,LEFT JOIN和INNER JOIN的区别在于它们如何处理没有匹配值的行。LEFT JOIN将返回左侧表的所有行,即使它们没有匹配的右侧表中的行,而INNER JOIN只返回左右两个表中都存在的行的组合。