SQL server连接两个数据库 sql怎么连接两个表_数据


从SQL调数据的时候,往往我们需要的字段并不在一个表里面,很多时候它们分布在不同的表里面,这时候就需要用到多表查询。

常见的几种表联结的方法,比如内联结(inner join)、左联结也叫左外联结(left join)、右联结也叫右外联结(right join)、全联结(full join)、交叉联结(cross join)等。

看完书之后大概了解各种联结是什么意思,比如left join就是把左边的表全部拿出来,用右边的表去一个一个匹配,inner join是把两张表相同部分取出来组合,全联结是把左边右边的数据都取出来组合。因为个人不是计算机专业的,对这些还停留在似懂非懂的状态,但是我突然想到,万一A表里面有两个1,B表里面只有一个1,他们是怎么进行联结的呢?是一边取一个吗?自从看了 @猴子 老师写的关于表联结的文章之后,突然感觉豁然开朗。

1.内联结(inner join)

内联结确实是把两张表相同的部分取出来然后再组合,这里我之前做的练习题来举个例子。


SQL server连接两个数据库 sql怎么连接两个表_SQL_02


当我们把这两个表进行内联结的时候,SQL做了一件什么事情呢?会给我们返回一个什么结果?我先用文氏图来表示一下这个结果。


SQL server连接两个数据库 sql怎么连接两个表_SQL server连接两个数据库_03


红色区域就是返回结果,那么SQL运行过程是怎么样的呢?


SQL server连接两个数据库 sql怎么连接两个表_字段_04


这波灵魂作图怎么样?是不是一下觉得世界都亮了~!

2.左联结(left join)

把左表的数据都取出来,右表的数据与左表数据相匹配。

又要开始灵魂作图了,前方高能~

文氏图是这个样子


SQL server连接两个数据库 sql怎么连接两个表_字段_05


SQL server连接两个数据库 sql怎么连接两个表_SQL_06


右联结(right join)同左联结,效果一样,一般我都用左联结,顺手。

3.全联结(full join)

这个就更狠了,不管三七二十一,左表右表的数据全部拿出来,没有对应的数据就用NULL值填充。

文氏图如下


SQL server连接两个数据库 sql怎么连接两个表_sql 取两个表_07


SQL server连接两个数据库 sql怎么连接两个表_SQL server连接两个数据库_08


4.交叉联结(cross join)

这个我放在最后,是因为我用得真的很少,做了很多练习题,一直没用到过,这儿有一个概念就是,交叉联结等于笛卡尔积。笛卡尔积相当于两个集合的组合情况,我理解得式这样。

比如有两个集合A和B,A={a,b},B={c,d},他俩的组合情况就是A集合先拿出一个值与B集合的值一个一个牵手,组合成ac,ad,然后A集合再拿出一个值与B集合的值组合,组合成bc,cd,这样一共就出现了4中情况。两个表的笛卡尔积就是两个表行数的乘积m*n。

再拿扑克牌举个例子,一副有四种花色:黑桃、红桃、梅花和方片

有A~K一共13张,每张有四种花色,所以他们的笛卡尔积是4*13=52张,再加大小王,一共54张扑克牌。

交叉联结的表的字段数就是两个表字段数的和。

还是拿学生表和成绩表举例子。


SQL server连接两个数据库 sql怎么连接两个表_数据_09


这次就先分享这么多,以后有什么其他想法还会接着补充。