为了能够很好理解MySQL中表连接方式,以如下两个表作为例子演示:
- Table1:t1
id | name |
---|---|
1 | 张三 |
2 | 李四 |
4 | 王五 |
- Table2:t2
id | age |
---|---|
1 | 18 |
2 | 20 |
3 | 19 |
1. 笛卡尔积
两表关联,把左表的列和右表的列通过笛卡尔积的形式表达出来。
-
语法
select * from t1 join t2
-
结果
id | name | id | age |
---|---|---|---|
1 | 张三 | 1 | 18 |
2 | 李四 | 1 | 18 |
4 | 王五 | 1 | 18 |
1 | 张三 | 2 | 20 |
2 | 李四 | 2 | 20 |
4 | 王五 | 2 | 20 |
1 | 张三 | 3 | 19 |
2 | 李四 | 3 | 19 |
4 | 王五 | 3 | 19 |
2.外连接
2.1 左外连接:left join
两表关联,左表全部保留,右表关联不上用null表示。
- 示意图
-
语法
select * from t1 left join t2 on t1.id = t2.id
-
结果
id | name | id | age |
---|---|---|---|
1 | 张三 | 1 | 18 |
2 | 李四 | 2 | 20 |
4 | 王五 | null | null |
2.2 右外连接
两表关联,右表全部保留,左表关联不上用null表示。
- 示意图
- 语法
select * from t1 right join t2 on t1.id = t2.id
- 结果
id | name | id | age |
---|---|---|---|
1 | 张三 | 1 | 18 |
2 | 李四 | 2 | 20 |
null | null | 3 | 19 |
2.3 全连接:full join
两表关联,两表的内容均保留,没有关联的字段用null表示。
- 示意图
- 语法
oracle里面有full join,但是在mysql中没有full join。我们可以使用union来达到目的。
(1)oracle
select * from t1 full join t2 on t1.id = t2.id
(2)mysql
select * from t1 left join t2 on t1.id = t2.id
union
select * from t1 right join t2 on t1.id = t2.id;
结果
id | name | id | age |
---|---|---|---|
1 | 张三 | 1 | 18 |
2 | 李四 | 2 | 20 |
4 | 王五 | null | null |
null | null | 3 | 19 |
3. 内连接:inner join
两表关联,保留两表中交集的记录。
- 示意图
- 语法
select * from t1 inner join t2 on t1.id = t2.id;
- 结果
id | name | id | age |
---|---|---|---|
1 | 张三 | 1 | 18 |
2 | 李四 | 2 | 20 |
4. 更多的连接方式
4.1 左表独有
两表关联,查询左表独有的数据,类似于集合中的t1 - t2。
- 示意图
- 语法
select * from t1 left join t2 on t1.id = t2.id where t2.id is null;
- 结果
id | name | id | age |
---|---|---|---|
4 | 王五 | null | null |
4.2 右表独有
两表关联,查询右表独有的数据,类似于集合中的t2 - t1。
- 示意图
- 语法
select * from t1 left join t2 on t1.id = t2.id where t1.id is null;
- 结果
id | name | id | age |
---|---|---|---|
null | null | 3 | 19 |
4.3 并集去交集
两表关联,取并集然后去交集。
- 示意图
- 语法
select * from t1 left join t2 on t1.id = t2.id where t2.id is null
union
select * from t1 right join t2 on t1.id = t2.id where t1.id is null;
- 输出
id | name | id | age |
---|---|---|---|
4 | 王五 | null | null |
null | null | 3 | 19 |