MySQL 联表查询可以说是使用 MySQL 必须面对的问题, 而且在实际的工作中, 使用比较多的查询大概也是联表查询. 虽然, 经常使用联表查询, 但是你真的清楚其中的机制吗?
带着这个问题, 下面让我们进入本文的主题 -- 图说 MySQL 的几种 join 连接.
基本概念
连接 (join) 就是将多个表中的字段根据匹配条件进行横向的拼接.
左表: 在语法上位于 join 左边的表, 叫左表.
右表: 在语法上位于 join 右边的表, 叫右表.
图说 join 连接
1, 交差连接(cross join)
用左表中的每一行数据去匹配右表中的每一行数据, 且认为全部匹配成功. 最终的结果集是迪卡尔积.
语法:
select * from 左表 cross join 右表;
示例:
2, 内连接(inner join)
使用左表中的每一条记录去匹配右表的所有的记录, 根据匹配的条件, 如果成立, 保留整条记录, 如果不成立则丢弃.
用文氏图表示, 则如下:
语法:
select * from 左表 [inner] join 右表 [on 条件]
示例:
3, 左连接(left join)
将左表作为主表, 用主表中的每一条记录, 去匹配从表 (右表) 中的所有记录, 根据匹配的条件, 如果成功则将主表的记录中的字段与从表的记录中的记录, 拼接成一条完整的记录, 放到结果集; 如果不成功则将从表中的记录中的字段全部置为 null, 保留主表中的字段.
用文氏图表示, 如下:
语法:
select * from 左表 left join 右表[on 条件]
示例:
4, 右连接(right join)
将右表作为主表, 用主表中的每一条记录, 匹配从表中的所有记录, 根据匹配的条件, 如果成功则将主表的记录中的字段与从表的记录中的记录, 拼接成一条完整的记录, 放到结果集. 如果不成功则将从表中的记录中的字段全部置为 null, 保留主表中的字段.
用文氏图表示, 如下:
语法:
select * from 左表 right join 右表[on 条件]
示例:
5, 自然连接(natural join)
对两表进行连接查询时, 系统会盲目的用同名字段为匹配条件. 会合并同名字段, 并且将匹配字段放到结果集的前面.
然自然连接分为左自连接和右自然连接.
直接使用 natural join 连接主表和从表, 相当于内连接
当使用 natural left join 时, 相当于左连接
当使用 natural right join 时, 相当于右连接
自然链接(natural join)
语法:
select * from 左表 natural join 右表
示例:
左自然连接(natural left join)
语法:
select * from 左表 natural left join 右表
示例:
右自然连接(natural right join)
语法:
select * from 左表 natural right join 右表
示例:
来源: https://www.thinksaas.cn/group/topic/839469/