JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
本次展示采用数据库两表,如下图:
STUDENTONE_MESSAGE表
STUDENTTWO_MESSAGE表
1.JOIN连接之内连接(INNER JOIN)
a.INNER JOIN内连接也叫显性内连接
内连接的图片效果:
select * from studentone_message a
INNER JOIN studenttwo_message b
on a.id=b.id
查询结果如图所示:
总结:
INNER JOIN内连接,展示的是两表之间的交集,即获取的是符合查询条件(上面sql语句中a.id=b.id)的信息。
隐形内连接:where连接
有显性内连接,当然也会有隐形内连接。一般的where 连接多个表也属于内连接,在数据库中被称为隐性内链接。如下:
select * from studentone_message a,studenttwo_message b
WHERE a.id=b.id
2.JOIN连接之左连接/左外连接(LEFT JOIN/LEFT OUTER JOIN)
左连接的图片效果:
select * from studentone_message a
LEFT JOIN studenttwo_message b
on a.id=b.id
查询结果如图所示:
总结:
(1).左连接是以LEFT JOIN为基准进行查询,LEFT JOIN左边studentone_message为左表,右边studenttwo_message为右表。左连接查询的就是左表的全部信息和符合查询条件的信息(例如上面的a.id=b.id,即左右两表符合关联查询条件的信息)两部分。
(2).如果左表展示出来的全部信息,右表没有相对应的信息,则右表记录为null。(例如上面图片中,左表的全部信息有3个ID,而右表ID=1003没有,所以会对应显示null)
3.JOIN连接之右连接/右外连接(RIGHT JOIN/RIGHT OUTER JOIN)
右连接的图片效果:
select * from studentone_message a
RIGHT JOIN studenttwo_message b
on a.id=b.id
查询结果如图所示:
总结:
(1).从上面看出,右连接与左连接正好相反,以RIGHT JOIN为基准,展示的信息是RIGHT JOIN右边右表的全部信息加上左右两边符合关联查询条件的(即上面的a.id=b.id这个条件)。
(2).如果右表展示出来的全部信息,左表没有相对应的信息,则左表记录为null。(例如上面图片中,右表的全部信息有5个ID,而左表从ID=1004开始便无法跟右表对应,所以会对应显示null)
4.JOIN连接之全连接(FULL JOIN)
!!!MySql不支持全连接查询,可以用union代替,UNION联合连接–点击查看详情。
为做全连接演示,所以在Oracle新建两张:
select * from message1 a
FULL JOIN message2 b
on a.id=b.id
查询结果如图所示:
总结:
Full outer join展示的是a表和b表的全部信息(a和b的并集)。但需要注意的是,对于没有匹配的记录(即a.id和b.id没有一一对应的),则会以null做为值。可以使用IFNULL判断。
5.JOIN连接之交叉连接(笛卡尔积)(CROSS JOIN)
a.不带where条件子句,它返回的是被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积(例如上表中:message1表的3条数据*message2表的4条数据,最后得到12条数据,就是下面笛卡尔积查询出来的总记录数)。
select * from message1 a
cross JOIN message2 b
b.如果带where,返回或显示的是匹配条件成立的行数
select * from message1 a
cross JOIN message2 b
where
a.id=b.id
查询结果如图所示:
总结:
1.CROSS JOIN(笛卡尔积)是两个表每一个字段相互匹配, 得出的结果就是笛卡尔积。笛卡尔积也等同于交叉连接。
2.CROSS JOIN(笛卡尔积)带条件查询, 查询结果跟等值连接(内连接)(INNER JOIN连接)、where连接的查询结果是一样,并且后面加条件只能用where,不能用on。
这里说的是:inner join、left join和right join的优化方法:
a.找出驱动表和被驱动表,在被驱动表上建立索引,可提高连接性能。
b.内连接inner join和左连接left join差不多,都需要优化右表。而右连接right join需要优化左表。
比较:
左连接和内连接优于右连接,左连接和内连接的比较取决于需求,单纯看性能是差不多的。
备注:
索引一般为(主键、唯一索引、前缀索引等);
左连接left join中,左表为驱动表,右表为被驱动表;右连接right join中,右表为驱动表,左表为被驱动表。
微信公众号搜索程序员有话讲,每一个关注都是对我最好的奖励。