之前一直对join相关语句的语法和效果模模糊糊的,今天特地整理了一下学习成果,希望对大家有用。O(∩_∩)O~~
join的类型主要有一下五种:
1、内连接(inner)
2、全外连接(outer)
3、左连接(left)
4、右连接(right)
5、交叉连接(cross)
下面开始逐一说明。(附上练习用的两个表:表A,表B)
一、内连接
内连接是根据连接条件取两个表的交集。
select a.id aId ,a.name aName,b.id bId,b.name bName from A a inner join B b on a.id = b.id;
select a.id aId ,a.name aName,b.id bId,b.name bName from A a join B b on a.id = b.id;
select a.id aId ,a.name aName,b.id bId,b.name bName from A a ,B b where a.id = b.id;
这三个查询语句查询出结果相同。
二、全外连接
全外链接是根据连接条件将两个表链接起来,取两个表的并集。
select a.id aId ,a.name aName,b.id bId,b.name bName from A a left join B b on a.id = b.id union select a.id aId ,a.name aName,b.id bId,b.name bName from A a right join B b on a.id = b.id;
因为目前使用的MySql版本不支持直接使用 full join,所以使用 left join ...union ...right join 的语句代替。效果和 select a.id aId ,a.name aName,b.id bId,b.name bName from A a full join B b on a.id = b.id一样。
把左连接和右连接保留相同的部分,增加上各自不同的部分就是全外连接。
三、左连接
左连接是以from后的表为基础,展示这个表的全部信息,left join 后的表有符合连接条件的就添加上该表的相应信息,没有则以NULL补缺。
select a.id aId ,a.name aName,b.id bId,b.name bName from B b left join A a on a.id = b.id;
select a.id aId ,a.name aName,b.id bId,b.name bName from B b right join A a on a.id = b.id;
以上查询语句结果相同
四、右连接
右连接是以from后的表为基础,展示这个表的全部信息,right join 后的表有符合连接条件的就添加上该表的相应信息,没有则以NULL补缺。
select a.id aId ,a.name aName,b.id bId,b.name bName from A a right join B b on a.id = b.id;
select a.id aId ,a.name aName,b.id bId,b.name bName from B b left join A a on a.id = b.id;
五、交叉连接
交叉连接,返回两个表的笛卡尔乘积
select * from A a cross join B b;
select * from B b cross join A a;
以上语句都返回49条查询结果 。
select * from A a cross join B b where a.id = b.id;
是找出笛卡尔乘积中 a.id 和 b.id 相同的。