内连接(inner join)
从两张表中取出所有记录做笛卡尔积;利用匹配条件进行匹配;如果内连接没有条件,那么其实就是交叉连接,这是我们应该避免的
交叉连接
从两张表中取出所有记录做笛卡尔积,所有的结果都会进行保留;记录数 = 第一张表记录数 * 第二张表记录数;字段数 = 第一张表字段数 + 第二张表字段数(笛卡尔积),这里我们看到查询出来的记录数为16条
外连接
按照某一张表作为主表(表中所有记录在最后都会保留),根据条件去连接另外一张表,从而得到目标数据
外连接分为两种:左外连接(left outer join|left join),右外连接(right outer join|left join),写sql时可省略outer,直接写left join,right join
左外连接(left join)
确定主表,这里的order就是主表,左外连接就是拿主表的每一条记录,按照条件去匹配从表的每一条记录,如果满足匹配条件则保留;如果主表记录在从表中一条都没有匹配成功,那么也要保留该主表记录:从表对应的字段值都为NULL,可以看到主表userid为8的订单记录,找不到user表中的对应,所以对应的从表记录字段设置为NULL
右外连接(right join)
和右外连接类似,这里的user就是主表,右外连接就是拿主表的每一条记录,按照条件去匹配从表的每一条记录,如果满足匹配条件则保留;如果主表记录在从表中一条都没有匹配成功,那么也要保留该主表记录:从表对应的字段值都未NULL,可以看到,user_name为bob和kitty的用户均没有对应的order记录,所以返回NULL
总结
左连接:主表 left join 从表 on 连接条件
右连接:从表 right join 主表 on连接条件
关于左连接和右连接总结性的一句话:
左连接where只影向右表,右连接where只影响左表。
全连接
mysql不支持全连接,但是我们可以通过其他关键词组合起来完成全连接查询(其实全连接的数据就是左外连接和右外连接的集合),这里的意思就是获取所有的人,所有的订单,及关联数据