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 |
- 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值。
- 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)都是用于连接两个或多个表的操作,但是它们的连接方式和结果不同。
首先,让我们看一下内连接的示例:
假设我们有两个表:orders和customers,其中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_id和order_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只返回左右两个表中都存在的行的组合。
