【Oracle】Oracle的内外连接
目录结构:
1,Oracle中的内外连接
1.1,内连接
内连接就是符合条件的数据被选中,不符合条件的数据被过滤掉。
1.1.1 等值连接
先看看需要使用的表结构(在其它的例子中也可能被用上,其余代码也是):
1 table name:s_emp 2 Name Description 3 ------------------ ------------- 4 ID 员工编号 5 LAST_NAME 名称 6 FIRST_NAME 姓氏 7 USERID 身份证号 8 START_DATE 开始时间 9 COMMENTS 评论内容 10 MANAGER_ID 上级编号 11 TITLE 标题 12 DEPT_ID 部门编号 13 SALARY 薪水 14 COMMISSION_PCT 提成
1 table name:s_dept 2 Name Description 3 ------------------ ------------- 4 ID 部门编号 5 NAME 部门名称 6 REGION_ID 地区编号
显示每个员工的编号 姓氏 部门名称
select e.id,e.first_name,d.name from s_emp e,s_dept d --使用'='号表示等值连接 where e.dept_id=d.id;
1,1,2 非等值连接
1 table name:salgrade 2 Name Description 3 ------------------ ------------- 4 GRADE 薪水级别 5 LOSAL 下区间 6 HISAL 上区间
显示每个员工的编号 姓氏 薪水 薪水级别
select e.id,e.first_name,e.salary,s.grade from s_emp e,salgrade s --也可以使用 where e.salary >= s.losal and e.salary <= s.hisal where e.salary between losal and hisal;
1,1,3 自连接
显示所有领导的编号 姓氏
在s_emp表中,所有领导者的编号都出现在manager_id一栏,根据这一特点我们来进行如下分析:
所以代码如下:
select distinct m.id,m.first_name from s_emp e,s_emp m where e.manager_id=m.id;
1.2 外连接
1.2.1 外连接的特点
读者需要注意外连接和内连接不是完全对立的,它们的关系如下:
外连接的结果集=内连接的结果集+匹配不上的数据。
1,2,2 如何实现外连接
通过在字段后加上(+)来实现
(+)字段所在的表的对面表的数据全部被选中 。除此之外,内连接中被过滤的数据是通过NULL记录进行的匹配。
比如还是1,3,1的那个案例,我们已经求出了领导的编号,那么员工的信息又该怎么求呢?
经过分析我们只需要用外连接得到表中所有员工的信息,然后再减去领导的信息,得到的就是普通员工的信息了。
通过上面的动图我们可以看出,(+)字段对应表的全部数据都用null匹配出来了,因此内连接也可以通过外连接来表达,比如上面的1,3,1的案例也可以用如下的方式实现:
select distinct m.id,m.first_name from s_emp e,s_emp m --通过is not null筛选得到实际数据 where e.manager_id(+)=m.id and e.manager_id is not null;
这样也可以得出领导的信息。下面的代码,可以显示普通员工的信息(下面的代码和上面的代码恰好对立是相反的):
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;
2,SQL99的内外连接
为了在各个数据库厂商之间取得更大的统一性,美国国家标准学会(American NationalStandards Institute,ANSI)于1986年发布了第一个SQL标准,并于1989年发布了第二个版本,该版本已经被广泛地采用。ANSI在1992年更新了SQL标准的版本,即SQL92和SQL2,并于1999年再次更新为SQL99和SQL3标准。在每一次更新中,ANSI都在SQL中添加了新特性,并在语言中集成了新的命令和功能。
Oracle的内外连接和SQL99的内外连接可以相互转化。
2.1 SQL99的内连接
内连接只有满足表连接条件的数据才会被选出。
语法格式:
from a表 join b表 on 表的连接条件 where 过滤条件; from a表 [inner] join b表 on 表的连接条件 where 过滤条件;
s_dept表结构:
s_dept表数据:
s_region表结构:
table name:s_region Name Description ------------------ ------------- ID 地区编号 NAME 地区名称
s_region表数据:
下面是内部连接的代码:
select distinct d.id,d.name,r.name from s_region r join s_dept d on r.id=d.region_id;
结果如下,可以看出结果只有前12行数据被匹配出来:
下面这段代码和上面的一样:
select distinct d.id,d.name,r.name from s_region r,s_dept d where r.id=d.region_id;
2.2 SQL99的外连接
2.2.1 语法
from a表 left [outer] join b表 on 表的连接条件 where 过滤条件; from a表 right [outer] join b表 on 表的连接条件 where 过滤条件; from a表 full [outer] join b表 on 表的连接条件 where 过滤条件;
left join 形式的连接称为左连接。
查询结果包含join左侧表中的所有记录以及右侧表满足条件的记录。也就是a表中的全部数据都会被匹配出来,b表中符合条件的数据才会被匹配出来。
right join 形式的连接称为右连接。
查询结果包含join右侧表中的所有记录以及左侧表中满足条件的记录。也就是b表中的全部数据都会被匹配出来,a表中符合条件的数据才会被匹配出来。
full join 形式的连接称为全连接。
查询结果包含join左侧和右侧的全部数据。也就是a表和b表的所有数据都会被匹配出来。
本文为博主原创文章,转载请注明出处。