【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服务器装在本机上,那就不多说了, ...
随机推荐
- [Canvas]New Running Dog
欲看效果请下载后用Chrome浏览器打开index.html观看,下载地址:https://files.cnblogs.com/files/xiandedanteng/51-NewRunningDog ...
- 从 bootup.js 学习加载脚本等资源
本文内容 如何使用 示例 参考资料 本文的目的在于,通过 bootup.js 的源代码,认识如何从客户端加载服务器的文件,特别是 JavaScript 文件,注入到页面,并存储在本地缓存,以扩展对 J ...
- UiTextField 限制输入长度
-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementS ...
- sql语句查询某一天数据
--如果还有今天以后的数据 --一周内呢SELECT * FROM TB WHERE datediff(dd,DATE_TIME,getdate()) between 0 and 7 --从现在起往前 ...
- Azure Paas SQL 修改用户名密码的相关问题
现总结如下,供您参考: 1) 如何单独修改每个数据库的密码? 在portal中,我们提供了一个最高权限的,可管理服务器下所有数据库的服务器用户 跟密码,但在实际使用中,由于权限过大,会有潜在的安全隐 ...
- angularjs初始化时不显示模板内容, 不显示html, 不显示template
template的内容可能在需要的数据准备好之前就显示出来了, ng-cloak可以解决这个问题 ng-cloak <div id="template1" ng-cloak& ...
- (转)C#中Invoke的用法 一
在用.NET Framework框架的WinForm构建GUI程序界面时,如果要在控件的事件响应函数中改变控件的状态,例如:某个按钮上的文本原先叫“打开”,单击之后按钮上的文本显示“关闭”,初学者往往 ...
- 【Linux】ssh建立隧道tunnel连接到内网设备
root@192.168.1.105 建立隧道: ssh -l root -N -f -R 9103:127.0.0.1:2222 work@11.11.13.17 解析:把本地127.0.0.1:2 ...
- .Net(c#)加密解密工具类:
/// <summary> /// .Net加密解密帮助类 /// </summary> public class NetCryptoHelper { #region des实 ...
- jqPlot图表插件学习之轴说明和label属性
一.准备工作 首先我们需要到官网下载所需的文件: 官网下载(笔者选择的是jquery.jqplot.1.0.8r1250.zip这个版本) 然后读者需要根据自己的情况新建一个项目并且按照如下的方式加载 ...