表连接
内连接
等值连接 员工和部门 部门和地区
非等值连接 员工的工资 和 对应的工资级别
自连接 谁是领导?
外连接
等值连接 员工和部门 (找出没有部门的员工) 部门和地区 (没有地区编号的部门)
非等值连接 员工的工资 和 对应的工资级别 (超出统计范围的工资)
自连接 谁是普通员工?
外连接的结果集 等于 内连接的结果集 加上匹配不上的记录
如何实现的?
(+) (+)的意思所在字段的对面的表的数据全部被匹配出来
本质上 底层是通过 NULL 记录进行的匹配
SQL99 内外连接
内连接标准
from a表 join b表 on 连接条件 where 过滤条件;
from a表 inner join b表 on 连接条件 where 过滤条件;
显示 每个部门的名字 和 对应的地区的名字
select d.name,r.name
from s_dept d,s_region r
where d.region_id = r.id;
select d.name,r.name
from s_dept d join s_region r
on d.region_id = r.id;
select d.name,r.name
from s_dept d inner join s_region r
on d.region_id = r.id;
外连接的标准
a表 left outer join b 表 on 表的连接条件 where 过滤条件;
a表 right outer join b 表 on 表的连接条件 where 过滤条件;
a表 full outer join b 表 on 表的连接条件 where 过滤条件;
a表 left outer join b 表 就是a表发起连接 意思就是a表的数据全部被匹配出来。
a表 right outer join b 表 就是b表发起连接 意思就是 b表的数据全部被匹配出来。
本质上也通过 NULL 记录进行的匹配
显示每个部门的名字 和 对应的地区的名字 没有地区编号的部门也要显示
select d.id, d.name,r.name
from s_dept d,s_region r
where d.region_id = r.id(+);
select d.id, d.name,r.name
from s_dept d left outer join s_region r
on d.region_id = r.id;
select d.id, d.name,r.name
from s_region r right outer join s_dept d
on d.region_id = r.id;
使用左外连接 实现 s_emp 谁是普通员工的问题 显示 id first_name
谁是领导?40 谁是普通员工 40 改成 left outer join 20
select distinct m.id,m.first_name
from s_emp e,s_emp m
where e.manager_id(+) = m.id and e.manager_id is null;
select distinct m.id,m.first_name
from s_emp m left outer join s_emp e
on e.manager_id = m.id where e.manager_id is null;
select distinct m.id,m.first_name
from s_emp m left join s_emp e
on e.manager_id = m.id where e.manager_id is null;
full outer join
全外连接 只是一个逻辑概念,代表左外连接的结果集 加上 右外连接的结果集 然后 排除重复的记录。
Oracle 中如何实现全外连接呢? 不是通过两端都加(+) 实现的。
而是通过 union 来实现的 union 的意思是 合并两个结果集 然后排重。
union all 合并两个结果集 不排重。
select id from s_emp union
select id from s_emp;
select id from s_emp union all
select id from s_emp;
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!