多表联查的用法

写在前面的话

我们知道在复杂的业务场景下很多时候后端需要给前端返回一个封装的页面,其中封装的页面需要来自不同的表的字段内容,这时候需要需要后端程序员为不同表之间添加一个==‘’关联‘’,将不同表联系起来,但为了实现表与表之间的解耦合,我们不需要设置外键进行表与表之间的关联,我们需要手动编写SQL进行表之间的关联==,但具体怎么实现呢?我们接着往下看。

一、表连接关键字的特点

  1. 内连接(INNER JOIN):
    • 返回两个表中匹配的行。
    • 可以是等值连接或非等值连接。(如 =),也可以是非等值条件(如 <, >, <=, >=, !=)。
  2. 左连接(LEFT JOIN 或 LEFT OUTER JOIN):
    • 返回左表的所有行,即使右表没有匹配的行也会显示 NULL。
    • 可以是等值连接或非等值连接。
  3. 右连接(RIGHT JOIN 或 RIGHT OUTER JOIN):
    • 返回右表的所有行,即使左表没有匹配的行也会显示 NULL。
    • 可以是等值连接或非等值连接。
  4. 全连接(FULL JOIN 或 FULL OUTER JOIN):
    • 返回两个表中的所有行,如果没有匹配的行则显示 NULL。
    • 可以是等值连接或非等值连接。
  5. 交叉连接(CROSS JOIN):
    • 返回两个表的笛卡尔积(即所有可能的组合)。
    • 不需要指定连接条件。

二、表连接关键字的使用

1.内连接

假设我们有两个表table1 和 table2:
table1: 
| id | name |
|----|-------| 
| 1 | Alice |
| 2 | Bob | 
| 3 | Carol |
table2: 
| id | city |
|----|-------| 
| 1 | NY |
| 2 | LA |

执行内连接:

SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id;	

结果:

idnameidcity
1Alice1NY
2Bob2LA

结论:

内连接返回两个表中匹配的行。只有当两个表中的行满足连接条件时,才会出现在结果集中。

特点:

  • 返回匹配行:只返回两个表中匹配的行。
  • 可以是等值连接或非等值连接:连接条件可以是等值条件(如 =),也可以是非等值条件(如 <, >, <=, >=, !=)。

2.左连接

使用相同的表 table1 和 table2:
table1: 
| id | name |
|----|-------| 
| 1 | Alice |
| 2 | Bob | 
| 3 | Carol |
table2: 
| id | city |
|----|-------| 
| 1 | NY |
| 2 | LA |

执行左连接:

SELECT *
FROM table1
LEFT JOIN table2
ON table1.id = table2.id;	

结果:

idnameidcity
1Alice1NY
2Bob2LA
3CarolNULLNULL

结论:

内连接返回两个表中匹配的行。只有当两个表中的行满足连接条件时,才会出现在结果集中。

特点:

  • 返回匹配行:只返回两个表中匹配的行。
  • 可以是等值连接或非等值连接:连接条件可以是等值条件(如 =),也可以是非等值条件(如 <, >, <=, >=, !=)。

3.右连接

使用相同的表 table1 和 table2:
table1: 
| id | name |
|----|-------| 
| 1 | Alice |
| 2 | Bob | 
| 3 | Carol |
table2: 
| id | city |
|----|-------| 
| 1 | NY |
| 2 | LA |

执行右连接:

SELECT *
FROM table1
RIGHT JOIN table2
ON table1.id = table2.id;

结果:

idnameidcity
1Alice1NY
2Bob2LA

结论:
全连接返回两个表中的所有行,如果没有匹配的行则显示 NULL。

特点:

  • 返回两个表中的所有行:确保两个表中的所有行都会出现在结果集中。
  • 可以是等值连接或非等值连接:连接条件可以是等值条件,也可以是非等值条件。

4.全连接

使用相同的表 table1 和 table2:
table1: 
| id | name |
|----|-------| 
| 1 | Alice |
| 2 | Bob | 
| 3 | Carol |
table2: 
| id | city |
|----|-------| 
| 1 | NY |
| 2 | LA |

执行全连接:

SELECT *
FROM table1
FULL JOIN table2
ON table1.id = table2.id;
idnameidcity
1Alice1NY
2Bob2LA
3CarolNULLNULL
1Alice1NY
2Bob2LA

结论:

全连接返回两个表中的所有行,如果没有匹配的行则显示 NULL。

特点:

  • 返回两个表中的所有行:确保两个表中的所有行都会出现在结果集中。
  • 可以是等值连接或非等值连接:连接条件可以是等值条件,也可以是非等值条件。

注意mysql不支持full join 关键字

mysql数据库的全连接可以使用左右连接然后使用union all关键字联合起来

如:

image-20241005133518794

5.交叉连接

使用相同的表 table1 和 table2:
table1: 
| id | name |
|----|-------| 
| 1 | Alice |
| 2 | Bob | 
| 3 | Carol |
table2: 
| id | city |
|----|-------| 
| 1 | NY |
| 2 | LA |

执行交叉连接:

SELECT *
FROM table1
CROSS JOIN table2;

结果:

idnameidcity
1Alice1NY
1Alice2LA
2Bob1NY
2Bob2LA
3Carol1NY
3Carol2LA

以上就是多表联查的基本内容啦

关注我,带你学习更多有用的编程技能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王路飞的挚友

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

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

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

打赏作者

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

抵扣说明:

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

余额充值