内连接(inner join)与外连接(outer join)小结

转载自 : 内连接(inner join)与外连接(outer join)小结_蝉 沐 风的博客-优快云博客_inner join


mySQL包含两种联接,分别是内连接(inner join)和外连接(out join),但我们又同时听说过左连接,交叉连接等术语,本文旨在总结这些术语之间的关系。

1. 内连接

首先说明内连接的一个重要性质:内连接查询结果与表的顺序无关
(当然顺序可能会发生变化,但是对应关系绝对不会错乱!!!)

1.1 交叉连接(cross join)

当然,他还有其他的名字,比如:笛卡尔积,交叉积,还有最奇怪的名字“没有连接”(no join)
这里写图片描述 这里写图片描述
使用下列命令同时查询玩具表的toy列和男孩表的boy列,得到的结果就是交叉连接

SELECT t.toy,b.boy
FROM toys AS t
    CROSS JOIN
    boys AS b;

其中,CROSS JOIN可以省略,简写为

SELECT t.toy,b.boy
FROM toys AS t,    boys AS b;

交叉连接回把第一张表的每个值与第二张表的每个值进行匹配,结果如下

这里写图片描述

 交叉连接是内连接的一种,你又可以把内连接看作是通过查询中的条件过滤掉某些结果数据行之后的交叉连接。

1.2 相等连接

我们假设每个男孩子都又一个玩具,表之间是一对一的关系,toy_id是外键,数据库表如下图

这里写图片描述这里写图片描述
 
我们想找到每个男孩儿拥有什么玩具,只需要将boys表中的toy_id和toys中的主键进行比对,就会得到结果 

SELECT boys.boy,toys.toy
FROM boys
    INNER JOIN
    toys
ON boys.toy_id=toys.toy_id;

这里写图片描述
1.3 不等连接

我们继续沿用1.2中的表结构,如果我们想找到每个男孩儿没有的玩具,这时候我们可以使用不等连接(说白了就是=换成<>,其他没有什么区别)

SELECT boys.boy,toys.toy
FROM boys
    INNER JOIN
    toys
ON boys.toy_id<>toys.toy_id
ORDER BY boys.boy;

这里写图片描述

1.4 自然连接

继续沿用1.2的表结构。。。。。
注意:自然连接只有在连接的列在两张表中的名称都相同时才会有用
其实,自然连接就是自动识别相同列的相等连接

SELECT boys.boy,toys.toy
FROM boys
    NATURAL JOIN
    toys
ORDER BY boys.boy;

得到的结果和1.2中的结果完全一样(顺序可能不同)

这里写图片描述
2. 外连接

首先说明外连接不同于内连接的一个性质:外连接查询与表的顺序有关

 

2.1 左外连接

LEFT OUTER JOIN(左外连接)接收左表的所有行,并用这些行与右表进行匹配
当左表与右表具有一对多的关系时,左外连接特别有用。我们仍然使用之前的表结构

这里写图片描述这里写图片描述

现在我们利用左外连接找出每个男孩拥有的玩具

SELECT b.boy,t.toy
FROM boys b
LEFT OUTER JOIN toys t
ON b.toy_id=t.toy_id;

LEFT OUTER JOIN左边的表boys我们称为左表,右边的toys称为右表,所以LEFT OUTER JOIN会取得左表boys的所有行和右表的toys的行进行匹配,结果如下

这里写图片描述
我们的查询结果和使用内连接时一样,难道说内连接和外连接没区别吗?怎么可能!!!接下来我们改变一下左表boys的表结构
 这里写图片描述这里写图片描述
我们向boys中新添加了一个Andy,把他的toy_id设置为6,注意,6在toys表中没有对应的玩具,接下来再次运行上述程序

 这里写图片描述

 我们发现居然出现了一个NULL,NULL的出现是要告诉我们右表toys中没有与左表boys中的Andy相匹配的行,也就是说

外连接一定会提供数据行,无论能否在另一个表中找出相匹配的行

接着做个实验,我们调换左表和右表的顺序

SELECT b.boy,t.toy
FROM toys t
LEFT OUTER JOIN boys b
ON b.toy_id=t.toy_id;

这里写图片描述

结论:出现NULL的列总是右表中的列

以下时左外连接的实际匹配过程

toys中的玩具hula hoop与boys中的Davey的记录比对,toys.toys_is=1,boys.toy_is=3
不匹配
toys中的玩具hula hoop与boys中的Bobby的记录比对,toys.toys_is=1,boys.toy_is=5
不匹配
toys中的玩具hula hoop与boys中的Beaver的记录比对,toys.toys_is=1,boys.toy_is=2
不匹配
toys中的玩具hula hoop与boys中的Richie的记录比对,toys.toys_is=1,boys.toy_is=1
成功匹配
…省略toy_id=2,3的匹配过程
toys中的玩具harmonica与boys中的Davey的记录比对,toys.toys_is=4,boys.toy_is=3
不匹配
toys中的玩具harmonica与boys中的Bobby的记录比对,toys.toys_is=4,boys.toy_is=5
不匹配
toys中的玩具harmonica与boys中的Beaver的记录比对,toys.toys_is=4,boys.toy_is=2
不匹配
toys中的玩具harmonica与boys中的Richie的记录比对,toys.toys_is=4,boys.toy_is=1
不匹配
右表查找完毕,没有匹配项,因此创建带有NULL值的行来对应harmonica
…省略baseball cards的匹配过程

2.2 右外连接

与左外连接完全相同,只不过是用右表来评价左表
此外:RIGHT OUTER JOIN左侧的表为右表!!!!!
这里只简单举一个例子,具体内容参考左外连接

SELECT b.boy,t.toy
FROM toys t
RIGHT OUTER JOIN boys b
ON b.toy_id=t.toy_id;

上述代码等同于

SELECT b.boy,t.toy
FROM boys b
LEFT OUTER JOIN toys t
ON b.toy_id=t.toy_id;

这两种写法都是都把toys作为右表,把boys作为左表

实验的表结构如下:
这里写图片描述这里写图片描述

结果:

这里写图片描述
在实际运用过程中,我们一般倾向于只使用一种,另一种简单了解就好。

### 不同类型的SQL连接及其用法 #### Inner Join `INNER JOIN` 是一种内部联结操作,它只返回两个表中满足连接条件的记录。如果某个表中的某条记录无法找到匹配项,则该记录不会被包含在最终结果集中。 ```sql SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.id = t2.id; ``` 上述语句表示从 `table1` `table2` 中选取那些具有相同 `id` 值的行[^1]。 --- #### Outer Join `OUTER JOIN` 属于外部联结的一种形式,它可以分为三种子类型:左外联结 (`LEFT OUTER JOIN`)、右外联结 (`RIGHT OUTER JOIN`) 全外联结 (`FULL OUTER JOIN`)。 - **Left Outer Join**: 返回左侧表的所有记录以及右侧表中符合条件的记录。如果没有匹配项,则右侧字段填充为 NULL。 ```sql SELECT * FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.id = t2.id; ``` - **Right Outer Join**: 返回右侧表的所有记录以及左侧表中符合条件的记录。如果没有匹配项,则左侧字段填充为 NULL。 ```sql SELECT * FROM table1 t1 RIGHT OUTER JOIN table2 t2 ON t1.id = t2.id; ``` - **Full Outer Join**: 返回两侧表的所有记录,并将不匹配的部分填充为 NULL。这种联结方式通常用于需要获取完整的数据集场景下。 ```sql SELECT * FROM table1 t1 FULL OUTER JOIN table2 t2 ON t1.id = t2.id; ``` 需要注意的是,在某些数据库系统(如 MySQL),并不支持 `FULL OUTER JOIN`,可以通过组合使用 `UNION ALL` 来实现其功能[^4]。 --- #### Cross Join `CROSS JOIN` 表示笛卡尔积运算,即第一个表中的每一行都会第二个表中的每一行配对形成新的组合。因此,当两表分别拥有 m n 行时,交叉联结会产生 m * n 条记录作为输出结果。 ```sql SELECT * FROM table1 t1 CROSS JOIN table2 t2; ``` 此方法适用于特定需求下的数据分析场合,但在实际应用中应谨慎对待因可能引发性能瓶颈问题[^2]。 --- ### 总结对比 | 类型 | 描述 | |--------------|----------------------------------------------------------------------------------------| | INNER JOIN | 只保留两张表格间存在关联关系的数据部分 | | LEFT/RIGHT JOIN | 左侧或右侧保持全部原始资料的同时加入另一方相吻合的信息 | | FULL JOIN | 合并来自双方所有的可用资讯 | | CROSS JOIN | 创建完全无约束的产品集合 | 以上就是关于几种常见 SQL 联接模式的概念解析及相关实例展示[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值