这里介绍的连接有:
- 交叉连接。
- 内连接。
- 外连接。
- 自连接
交叉连接:
这应该是最简单的一种连接方式,但是就我目前经验来说使用到的地方很少。基本格式是:
select *(或者其他的两个表内的数据) from tableA join tableB;
完全只是在两个表之间加入了一个join的关键字,所产生的效果,恩,你可以想象一下多项式乘法,乘数每一项乘以被乘数的每一项得到一个新的结果,而放在数据库中就是A表的每一项配上B表的每项重复来一遍,大家可以找两张表试一试。
内连接:
先来个例子放着:
可以看出其中的关键字是inner join与on所带的语句,其中inner是指明了连接类型为内连接,on子句是描述连接的条件。
内连接是值A表中的某一列(on子句中)存在某个值与B表中的某一列(on子句中)存在某个值关系成立,则结果集中包含有这个值,否则则排除这个值,这也是我们最为常用的一种连接类型。
on子句中如果两个表的列名相同可以使用using子句代替,不过不推荐:
select e.fname,e.lname,d.name from employee e inner join department d using(dept_id);
当你需要连接三个或更多表时:
有点像子查询。
自连接(其实也是内连接):
我们可以对表自身进行连接,这在某些情况下可以能需要,例如(employee表包含了一个指向自身的外键,即指向本表主键的列(superior_emp_id)。该列指向了雇员的主管(除非该雇员属于领导层,这种情况下该列应为null)。使用自连接,可以在列出每个雇员姓名的同时列出主管的姓名):
外连接:
如果你想要包含某个表的所有行,而不考虑每行是否在另一个表中存在匹配,那么可以使用外连接。
先介绍外连接的几种类型:
- 左外连接
- 右外连接
- 三路外连接
- 自外连接
左外链接:
例子:
关键字left指出连接左边的表决定结果集的行数,而右边的只负责提过与之匹配的列值。
右外连接与之相反:
三路外连接:
将一个表与其他两个表进行外连接。如:
自外连接:
跟自连接类似,可以补充上面自连接,加入主管自身:
Michael Smith地位最高,没有主管这玩意的存在。这是作为左连接的情况,下面让我们看看右连接的情况:
这里查询除了显示每个主管外,还有其管理的雇员集合,因此,Michael Smith作为Susan Barker和Robert Tyler的主管出现了两次,而Susan Barker显示了一次,但她不是任何人的主管(该行第一二列显示为null)。所以18个雇员在第三列跟第四列出现至少一次,其中管理雇员超过一人的会出现不止一次,所以该结果集明显大于前一个。所以,使用外连接时候确定使用左外连接还是右外连接是很重要的。