【Oracle】Oracle的内外连接
目录结构:
1,Oracle中的内外连接
1.1,内连接
内连接就是符合条件的数据被选中,不符合条件的数据被过滤掉。
1.1.1 等值连接
先看看需要使用的表结构(在其它的例子中也可能被用上,其余代码也是):
table name:s_emp
Name Description
------------------ -------------
ID 员工编号
LAST_NAME 名称
FIRST_NAME 姓氏
USERID 身份证号
START_DATE 开始时间
COMMENTS 评论内容
MANAGER_ID 上级编号
TITLE 标题
DEPT_ID 部门编号
SALARY 薪水
COMMISSION_PCT 提成
s_emp表(员工表)结构
table name:s_dept
Name Description
------------------ -------------
ID 部门编号
NAME 部门名称
REGION_ID 地区编号
s_dept表(部门表)结构
显示每个员工的编号 姓氏 部门名称
select e.id,e.first_name,d.name
from s_emp e,s_dept d
--使用'='号表示等值连接
where e.dept_id=d.id;
1,1,2 非等值连接
table name:salgrade
Name Description
------------------ -------------
GRADE 薪水级别
LOSAL 下区间
HISAL 上区间
salgrade表(薪水级别表)结构
显示每个员工的编号 姓氏 薪水 薪水级别
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(地区信息)表结构
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表的所有数据都会被匹配出来。
本文为博主原创文章,转载请注明出处。
【Oracle】Oracle的内外连接的更多相关文章
- oracle 内外连接,左连接,右连接 区别
首先讲解一下 on 与where后面接的条件的区别 on和where条件的区别如下:1. on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录.2.where条件是在 ...
- 浅谈Oracle表之间各种连接
Oracle表之间的连接分为三种: 1.内连接(自然连接) 2.外连接 2.1.左外连接(左边的表不加限制,查询出全部满足条件的结果) 2.2.右外连接(右边的表不加限制,查询出全部满足条件的结果) ...
- Tools下的mdscongiguer 文件中 43行 oracle 配置 发现需要连接库 -lclntsh libclntsh.so 库是个什么东西呢?
Tools下的mdscongiguer 文件中 43行 oracle 配置 发现需要连接库 -lclntsh libclntsh.so 库是个什么东西呢? 分想一个知乎网 ...
- Oracle 表三种连接方式(sql优化)
在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理. 一.连接方式: 嵌套循环(Nested Loops (NL)) (散列)哈希 ...
- 本地不安装oracle,PLsql远程连接
Oracle的Instant client工具包可以很好地解决本地不安装oracle,PLsql远程连接. 1.首先到Oracle网站下载Instant Client : http://www.ora ...
- 【Oracle+PHP】php连接oracle设定字符集,避免乱码
数据库用oracle,当php连接oracle的时候,最好指定字符集. 查PHP手册,oci_connect的第四个参数为charset,这是关键. 首先获取oracle的字符集,运行“select ...
- java oracle thin 和 oci 连接方式实现多数据库的故障切换
java oracle thin 和 oci 连接方式实现多数据库的故障切换 一.thin方式 该种方式简便易用非经常见. 当中URL为 jdbc:oracle:thin:@(DESCRIPTION= ...
- ORACLE无法删除当前连接用户
今天在做Oracle数据库是遇到ORACLE无法删除当前连接用户 ,经查找可用如下方法解决 . 在Oracle中删除用户时提示:ORACLE无法删除当前连接用户 可以用以下语句 Sql代码 ...
- oracle的本地远程连接和配置
Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍. 第一种情况: 若oracle服务器装在本机上,那就不多说了, ...
随机推荐
- glValidateProgram只用于调试
glValidateProgram应该只用于调试,用于release版本中会影响性能.以下是详细描述: Before doing so, however, we might want to che ...
- redis 安装报错
CentOS 6.5 安装 Redis 执行 make #error "Newer version of jemalloc required" 根据你系统安装时或之后安装的选项的情 ...
- Android 自定义 ListView 显示网络上 JSON 格式歌曲列表
本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章,没有源代码可下载,根据文中提供的代码片段,自己新建的项目(比较可恶 ...
- Solidworks直接打开SWB文件报错怎么办
- 面试总结——Java高级工程师(三)
https://blog.csdn.net/moneyshi/article/details/53086927
- 前台登录和Token信息交互流程
原来总是对前台登录,怎么利用token有点迷惑,后面仔细的想了一遍,把自己简单的想法记录下来,留作记录,以便后续优化 各路大神有什么看法也可以说,能更完善整个流程. 不说了,暴力的上图: 该图是出自c ...
- Aerospike系列:1:安装
1:下载源文件 wget http://www.aerospike.com/artifacts/aerospike-server-community/3.5.9/aerospike-server-co ...
- jquery 如何获取有多个class名的元素
1.情景展示 如何使用jquery获取带有多个class样式的元素? 2.解决方案 $("p.opinion.mb15.gray2e.max2line.mr20:contains('大摩 ...
- 【Linux】使用cat命令创建文本文件
在Linux界面输入 Linux:/usr/test # cat >test01.sh 接着按回车,输入内容:"echo hello world !" 回车后按 ctrl+d ...
- 使用OpenNI 2获取RGBD摄像头深度信息
NiViewer 安装好摄像头驱动和OpenNI后,在Tools文件夹中可以找到一个程序NiViewer.NiViewer的一些基本控制方法如下: 1. ESC关闭NiViewer程序 2. 右键可以 ...