Mysql的内、左、右、外、全连接

699 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

这个主题是我在偶然一次做项目想到的,并且由于自己的技术不高,所以进行了一次系统性学习。讲这个的目的是为了提高自己,并且解决现有项目中的笛卡尔积重复问题。

本文会有表字段与sql语句来帮助大家快速理解,讲得不好或者不对的地方还需请大家指出,让我及时修正!

image.png

Sql语言有很多个版本,我这里采用Mysql的语法进行描述。在RDBMS(关系型数据库)中sql是该数据库的基础。

多表连接查询

单表比较简单建议大家自行网上搜查,进行基础学习。

建立a表内容:

idname
1mouth
2sam
3bridge

建立b表内容:

idrid
11
22
32

内连接 Inner Join

内连接有三个写法,一个是带inner的,一个是当做where使用。

# 第一种
select标题
    *
from a 
    inner join b on a.id = b.rid
# 第二种
select 
    *
from a 
    join b on a.id = b.rid
# 第三种
select 
    *
from a,b 
where a.id = b.rid

上面三种写法都是等价的,唯一不同是第三种是隐形连接,第一种是显性连接,由于理解与规范问题第三种渐渐的淡出视野,用的最多还是第一种。

内连接会把两个表都匹配的内容展示出来,不匹配的会直接剔除。上方表内连接结果为:

idnameid(b)rid
1mouth11
2sam22
2sam32

左外连接(左连接)Left Join

left join 是 left outer join的简写。left join可理解为有左就显示,右侧没有就为null。

select * 
from a left join b on a.id = b.rid

由结果可以看出 3是为null的右表

image.png

left join是个非常重要的语句,我们大部分都是在使用这个语句

右外连接(右连接)Right Join

right join 是 right outer join的简写。right join可理解为右就显示,左侧没有就为null。

select * 
from a right join b on a.id = b.rid

因为right join是以右表进行筛选,把右表记录全部展示,左表有就显示,没有就显示为null

从结果可以看出坐标少了一条记录,这是因为右表没有记录对应左表 image.png

全连接 Full Join

全连接比较特殊 oracle数据库支持full join 但是mysql 不支持,我们一般使用union来连接查询结果以达到全连接的效果。

select * 
from a left join b on a.id = b.rid
union
select * 
from a right join b on a.id = b.rid

全连接会把左右两表的数据全部展示出来,左边没有就为null,右边没有就为null image.png

交叉连接 Cross Join

交叉连接会产生笛卡尔积,形成n x m列的数据

# 第一种
select * 
from a, b

select * 
from a cross join b
# 第二种

两种都可以交叉连接,一般交叉连接比较少用,一般会配上筛选条件来进行进一步筛选。

总结

  1. full join 在部分数据库中是不支持的
  2. 左右连接的本质是一样的,它们的特性也刚好相反