我使用的是Mysql 8.0版本,join的官方手册定义链接 1:
https://dev.mysql.com/doc/refman/8.0/en/join.html
注:以下均为我自己的理解和笔记,如果有错误欢迎指正。
Join
Join指合并两个或多个包含同个属性的table。如果这个属性中的元素在一个表有而另一个表没有,那么join后的结果中会忽略掉。
在Mysql中,单独使用join等价于cross join 和 inner join,但是在Standard sql中这三者不一样。
代码实例
书上的数据库样例,水手sailors, 船boats 和 租借记录reserves 三个表。其中sailors 和reserves如下:
*** join ‘sailors’ 和 ‘reserves’ 表的sql语句:***
select * from sailors S inner join reserves R on S.sid=R.sid;
结果:
这里将表Sailors 和 Reserves 结合,但join的方式是通过合并共有的sid列,如果一方有而另一方没有,则忽略掉。
可见在sailor中没有租借记录的人,即在reserves表中没有记录的人,就不会在结果表中有记录。
Left join
left join 会以第一个合并的table为首,保留合并其他table的列的所有intance,如果该信息不存在,则显示为null。所以不同的left join顺序也会导致最后的table结果不同。
代码实例
Left join ‘sailors’, ‘reserves’ 和 ‘boats’ 三个表:
- Left Join boats, reserves, sailors
select * from boats as B left join (reserves R,sailors S) on (R.sid = S.sid and B.bid = R.bid);
结果:
2. Left Join reserves, boats, sailors
select * from reserves as R left join (Boats B,sailors S) on (R.sid = S.sid and B.bid = R.bid);
结果:
- Left join sailors, boats, reserves
select * from sailors S left join (Boats B,reserves R) on (R.sid = S.sid
and B.bid = R.bid);
结果:
上述三种left join的结果均不同,这主要是left join的顺序不一致,最后也会按照第一个表的最左边列来补齐整个结果。