小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
这个主题是我在偶然一次做项目想到的,并且由于自己的技术不高,所以进行了一次系统性学习。讲这个的目的是为了提高自己,并且解决现有项目中的笛卡尔积重复问题。
本文会有表字段与sql语句来帮助大家快速理解,讲得不好或者不对的地方还需请大家指出,让我及时修正!
Sql语言有很多个版本,我这里采用Mysql的语法进行描述。在RDBMS(关系型数据库)中sql是该数据库的基础。
多表连接查询
单表比较简单建议大家自行网上搜查,进行基础学习。
建立a表内容:
| id | name |
|---|---|
| 1 | mouth |
| 2 | sam |
| 3 | bridge |
建立b表内容:
| id | rid |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 2 |
内连接 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
上面三种写法都是等价的,唯一不同是第三种是隐形连接,第一种是显性连接,由于理解与规范问题第三种渐渐的淡出视野,用的最多还是第一种。
内连接会把两个表都匹配的内容展示出来,不匹配的会直接剔除。上方表内连接结果为:
| id | name | id(b) | rid |
|---|---|---|---|
| 1 | mouth | 1 | 1 |
| 2 | sam | 2 | 2 |
| 2 | sam | 3 | 2 |
左外连接(左连接)Left Join
left join 是 left outer join的简写。left join可理解为有左就显示,右侧没有就为null。
select *
from a left join b on a.id = b.rid
由结果可以看出 3是为null的右表
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
从结果可以看出坐标少了一条记录,这是因为右表没有记录对应左表
全连接 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
交叉连接 Cross Join
交叉连接会产生笛卡尔积,形成n x m列的数据
# 第一种
select *
from a, b
select *
from a cross join b
# 第二种
两种都可以交叉连接,一般交叉连接比较少用,一般会配上筛选条件来进行进一步筛选。
总结
- full join 在部分数据库中是不支持的
- 左右连接的本质是一样的,它们的特性也刚好相反