写在前面的话
我们知道在复杂的业务场景下很多时候后端需要给前端返回一个封装的页面,其中封装的页面需要来自不同的表的字段内容,这时候需要需要后端程序员为不同表之间添加一个==‘’关联‘’,将不同表联系起来,但为了实现表与表之间的解耦合,我们不需要设置外键进行表与表之间的关联,我们需要手动编写SQL进行表之间的关联==,但具体怎么实现呢?我们接着往下看。
一、表连接关键字的特点
- 内连接(INNER JOIN):
- 返回两个表中匹配的行。
- 可以是等值连接或非等值连接。(如 =),也可以是非等值条件(如 <, >, <=, >=, !=)。
- 左连接(LEFT JOIN 或 LEFT OUTER JOIN):
- 返回左表的所有行,即使右表没有匹配的行也会显示 NULL。
- 可以是等值连接或非等值连接。
- 右连接(RIGHT JOIN 或 RIGHT OUTER JOIN):
- 返回右表的所有行,即使左表没有匹配的行也会显示 NULL。
- 可以是等值连接或非等值连接。
- 全连接(FULL JOIN 或 FULL OUTER JOIN):
- 返回两个表中的所有行,如果没有匹配的行则显示 NULL。
- 可以是等值连接或非等值连接。
- 交叉连接(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;
结果:
id | name | id | city |
---|---|---|---|
1 | Alice | 1 | NY |
2 | Bob | 2 | LA |
结论:
内连接返回两个表中匹配的行。只有当两个表中的行满足连接条件时,才会出现在结果集中。
特点:
- 返回匹配行:只返回两个表中匹配的行。
- 可以是等值连接或非等值连接:连接条件可以是等值条件(如 =),也可以是非等值条件(如 <, >, <=, >=, !=)。
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;
结果:
id | name | id | city |
---|---|---|---|
1 | Alice | 1 | NY |
2 | Bob | 2 | LA |
3 | Carol | NULL | NULL |
结论:
内连接返回两个表中匹配的行。只有当两个表中的行满足连接条件时,才会出现在结果集中。
特点:
- 返回匹配行:只返回两个表中匹配的行。
- 可以是等值连接或非等值连接:连接条件可以是等值条件(如 =),也可以是非等值条件(如 <, >, <=, >=, !=)。
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;
结果:
id | name | id | city |
---|---|---|---|
1 | Alice | 1 | NY |
2 | Bob | 2 | LA |
结论:
全连接返回两个表中的所有行,如果没有匹配的行则显示 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;
id | name | id | city |
---|---|---|---|
1 | Alice | 1 | NY |
2 | Bob | 2 | LA |
3 | Carol | NULL | NULL |
1 | Alice | 1 | NY |
2 | Bob | 2 | LA |
结论:
全连接返回两个表中的所有行,如果没有匹配的行则显示 NULL。
特点:
- 返回两个表中的所有行:确保两个表中的所有行都会出现在结果集中。
- 可以是等值连接或非等值连接:连接条件可以是等值条件,也可以是非等值条件。
注意mysql不支持full join 关键字
mysql数据库的全连接可以使用左右连接然后使用union all关键字联合起来
如:
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;
结果:
id | name | id | city |
---|---|---|---|
1 | Alice | 1 | NY |
1 | Alice | 2 | LA |
2 | Bob | 1 | NY |
2 | Bob | 2 | LA |
3 | Carol | 1 | NY |
3 | Carol | 2 | LA |
以上就是多表联查的基本内容啦
关注我,带你学习更多有用的编程技能。