SELECT *
FROM `id_name`
LEFT OUTER JOIN `id_age`
ON `id_age`.`id` = `id_name`.`id`;
left outer join 结果
SELECT *
FROM `id_name`
LEFT JOIN `id_age`
ON `id_age`.`id` = `id_name`.`id`;
left join 结果
结论:
left outer join和left join是一样的,left join是left outer join的简写,只不过关键字left outer join中体现了连接的类型,即外连接(注意:外连接必须指明是左外连接还是右外连接,通过关键字left和right区分)。在对表id_name和表id_age进行左(外)连接时,以左边的表id_name为主,输出左表id_name的所有行,输出右边的表id_age中符合连接条件(两个表的id相等)的行,即id=1的行,但若是右表中没有符合条件的行,则用NULL值替代。如上图结果,右表id_age中没有匹配左表id_name的id=2和id=3的行,因此用NULL值补齐。
(3)right outer join 和 right join
SELECT *
FROM `id_name`
RIGHT OUTER JOIN `id_age`
ON `id_age`.`id` = `id_name`.`id`;
right outer join 结果
SELECT *
FROM `id_name`
RIGHT JOIN `id_age`
ON `id_age`.`id` = `id_name`.`id`;
right join 结果
结论:
right outer join和right join是一样的,right join是right outer join的简写,只不过关键字right outer join中体现了连接的类型,即外连接(注意:外连接必须指明是左外连接还是右外连接,通过关键字left和right区分)。在对表id_name和表id_age进行右(外)连接时,以右边的表id_age为主,输出右表id_age的所有行,输出左边的表id_name中符合连接条件(两个表的id相等)的行,即id=1的行,但若是左表中没有符合条件的行,则用NULL值替代。如上图结果,左表id_name中没有匹配右表id_age的id=5的行,因此用NULL值补齐。
(4)left outer join 和 right outer join
采用左外连接,更换两个表的左右顺序后,再采用右外连接,输出的结果会一样吗?测试如下:
左表:id_name,右表:id_age,采用左外连接:
SELECT *
FROM `id_name`
LEFT OUTER JOIN `id_age`
ON `id_age`.`id` = `id_name`.`id`;
left outer join 结果
左表:id_age,右表:id_name,采用右外连接:
SELECT *
FROM `id_age`
RIGHT OUTER JOIN `id_name`
ON `id_age`.`id` = `id_name`.`id`;
在MySQL中,inner join后可以不加连接条件on,只不过得到的是笛卡尔积,但外连接必须加上连接条件on,不然报错。连接条件on是在连接表时使用的条件,过滤条件where是在表连接后,对连接好的表进行过滤时使用的条件。inner join后使用where和on的效果是一样的。另外,要注意左(右)外连接中on and 和 on where的区别。
希望有所帮助,欢迎指正!