数据库的外联和内联及自联inner join & outer join
自联:自联数据的来源不是多个表,而是一个表中两个字段的关系自联中一个表被虚拟成2个表
(两张表之间存在关系-》找出一张表的某行或多行)
select worker.name||'work for'||manager.name
from employee.worker,employee.manager
where worker.manager_id=manager.employee_id
1.关系代数
1.1
用表或者数据集合表示关系或者实体
用行表示元组
用列表示属性
1.2
选取返回满足指定条件的行
投影出数据集合中返回指定的列
笛卡尔积是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式进行组合
有关系的加法和减法,它可以在行的方向上合并两个表中的数据,就像把一个表垒在另一个表之上一样
交返回两个数据集合所共有的行
差返回只属于一个数据集合的行
连接在水平方向上合并两个表,其方法是:将两个表在共同数据项上相互匹配的那些行合并起来
除返回两个数据集之间的精确匹配
连接类型定义:
内连接 只连接匹配的行
左外连接 包含左边表的全部行(不管右边表中是否存在与它们匹配的行),以及右边表中全部匹配的行
右外连接 包含右边表的全部行(不管左边表中是否存在与它们匹配的行),以及左边表中全部匹配的行
全外连接 包含左右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行
(H)theta连接 使用等值以外的条件来匹配左右两个表中的行
交叉连接 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源的每个行与另一个数据源的每个行都--匹配
2.1内连接 inner join
select * from t_insitution i
inner join t_teller t
on i.inst_no=t.inst_no
where i.inst_no="5081"
等于下面这一个
select *from t_insitution i,t_teller t
where i.inst_no=t.inst_no and i.inst_no="5081"
2.2外连接
2.2.1左外连接 left outer join
select * from t_insitution i
left outer join t_teller t
on i.inst_no=t.inst_no
(outer可以省略)
2.2.2左右连接 right outer join
select * from t_insitution i
right outer join t_teller t
on i.inst_no=t.inst_no
2.2.3全外连接 full outer
全外连接返回参与连接的两个数据集合中的全部数据,无论是否具有与之相匹配的行在功能上,它等价于对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集
select * from t_insitution i
full outer join t_teller t
on i.inst_no=t.inst_no
2.2.4外连接与条件配合使用
当在内连接查询中加入条件是,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,但对于外连接情况就不同了当把条件加入到 join子句时,SQL ServerInformix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行如果将条件放到where子句中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选下面的两个查询展示了条件放置位子对执行结果的影响:
条件在join子句
select * from t_institution i
left outer join t_teller t
on i.inst_no=t.inst_no
and i.inst_no=5801
结果是;
inst_no inst_name inst_no teller_no teller_name
5801 天河区 5801 0001 tom
5801 天河区 5801 0002 david
5802 越秀区
5803 白云区
条件在where子句中
select * from t_institution i
left outer join t_teller t
on i.inst_no=t.inst_no
where i.inst_no=5801
结果是:
inst_no inst_name inst_no teller_no teller_name
5801 天河区 5801 0001 tom
5801 天河区 5801 0002 david
2.4自身连接
自身连接是指同一个表自己与自己进行这种一元连接通常用于从自反关系(也称递归关系)中抽取数据例如人力资源数据库中雇员与老板的关系
select s.inst_no,suerior_inst,s.inst_name,sup_inst_name,i.inst_no,i.inst_name
from t_institution i
join t_institution s
on i. superior_inst=s.inst_no
结果是:
superior_inst sup_inst_name inst_no inst_name
800 广州市 5801 天河区
800 广州市 5802 越秀区
800 广州市 5803 白云区
2.5交叉连接
交叉连接用于对两个源表进行纯关系代数的乘运算它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合数据集合中一的每个行都要与数据集合二中的每一个行分别组成一个新的行例如,如果第一个数据源中有5个行,而第二个数据源中有4个行,那么在它们之间进行交叉连接就会产生20个行人们将这种类型的结果集称为笛卡尔乘积
大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间
select * from t_institution i
cross join t_teller t
(交叉连接中没有on条件子句)
left join和left outer join其实就是一样,只是有达形式不一样了,这样明白了吧,相同的join,inner join是同一回事;
顺便也把左右联也说一下,最简单的表达是,当左联时,左表有的,联表没有,左表统一加个NULL值给他,右联相同道理,inner呢,就是交集才显示出来;