目录结构:

contents structure [+]

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 提成

s_emp表(员工表)结构

  1. table name:s_dept
  2. Name Description
  3. ------------------ -------------
  4. ID 部门编号
  5. NAME 部门名称
  6. REGION_ID 地区编号

s_dept表(部门表)结构

显示每个员工的编号 姓氏 部门名称

  1. select e.id,e.first_name,d.name
  2. from s_emp e,s_dept d
  3. --使用'='号表示等值连接
  4. where e.dept_id=d.id;

1,1,2 非等值连接

  1. table name:salgrade
  2. Name Description
  3. ------------------ -------------
  4. GRADE 薪水级别
  5. LOSAL 下区间
  6. HISAL 上区间

salgrade表(薪水级别表)结构

显示每个员工的编号 姓氏 薪水 薪水级别

  1. select e.id,e.first_name,e.salary,s.grade
  2. from s_emp e,salgrade s
  3. --也可以使用 where e.salary >= s.losal and e.salary <= s.hisal
  4. where e.salary between losal and hisal;

1,1,3 自连接

显示所有领导的编号 姓氏

在s_emp表中,所有领导者的编号都出现在manager_id一栏,根据这一特点我们来进行如下分析:

所以代码如下:

  1. select distinct m.id,m.first_name
  2. from s_emp e,s_emp m
  3. where e.manager_id=m.id;

1.2 外连接

1.2.1 外连接的特点

读者需要注意外连接和内连接不是完全对立的,它们的关系如下:

外连接的结果集=内连接的结果集+匹配不上的数据。

1,2,2 如何实现外连接

通过在字段后加上(+)来实现

(+)字段所在的表的对面表的数据全部被选中 。除此之外,内连接中被过滤的数据是通过NULL记录进行的匹配。

比如还是1,3,1的那个案例,我们已经求出了领导的编号,那么员工的信息又该怎么求呢?

经过分析我们只需要用外连接得到表中所有员工的信息,然后再减去领导的信息,得到的就是普通员工的信息了。

通过上面的动图我们可以看出,(+)字段对应表的全部数据都用null匹配出来了,因此内连接也可以通过外连接来表达,比如上面的1,3,1的案例也可以用如下的方式实现:

  1. select distinct m.id,m.first_name
  2. from s_emp e,s_emp m
  3. --通过is not null筛选得到实际数据
  4. where e.manager_id(+)=m.id and e.manager_id is not null;

这样也可以得出领导的信息。下面的代码,可以显示普通员工的信息(下面的代码和上面的代码恰好对立是相反的):

  1. select distinct m.id,m.first_name
  2. from s_emp e,s_emp m
  3. 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的内连接

内连接只有满足表连接条件的数据才会被选出。

语法格式:

  1. from a join b on 表的连接条件 where 过滤条件;
  2. from a [inner] join b on 表的连接条件 where 过滤条件;

s_dept表结构:

s_dept表(部门表)结构

s_dept表数据:

s_region表结构:

  1. table name:s_region
  2. Name Description
  3. ------------------ -------------
  4. ID 地区编号
  5. NAME 地区名称

s_region(地区信息)表结构

s_region表数据:

下面是内部连接的代码:

  1. select distinct d.id,d.name,r.name
  2. from s_region r join s_dept d
  3. on r.id=d.region_id;

结果如下,可以看出结果只有前12行数据被匹配出来:

下面这段代码和上面的一样:

  1. select distinct d.id,d.name,r.name
  2. from s_region r,s_dept d
  3. where r.id=d.region_id;

2.2 SQL99的外连接

2.2.1 语法

  1. from a left [outer] join b on 表的连接条件 where 过滤条件;
  2. from a right [outer] join b on 表的连接条件 where 过滤条件;
  3. 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的内外连接的更多相关文章

  1. oracle 内外连接,左连接,右连接 区别

    首先讲解一下 on 与where后面接的条件的区别 on和where条件的区别如下:1. on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录.2.where条件是在 ...

  2. 浅谈Oracle表之间各种连接

    Oracle表之间的连接分为三种: 1.内连接(自然连接) 2.外连接 2.1.左外连接(左边的表不加限制,查询出全部满足条件的结果) 2.2.右外连接(右边的表不加限制,查询出全部满足条件的结果) ...

  3. Tools下的mdscongiguer 文件中 43行 oracle 配置 发现需要连接库 -lclntsh libclntsh.so 库是个什么东西呢?

    Tools下的mdscongiguer     文件中 43行  oracle 配置      发现需要连接库 -lclntsh      libclntsh.so 库是个什么东西呢? 分想一个知乎网 ...

  4. Oracle 表三种连接方式(sql优化)

    在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理. 一.连接方式: 嵌套循环(Nested Loops (NL)) (散列)哈希 ...

  5. 本地不安装oracle,PLsql远程连接

    Oracle的Instant client工具包可以很好地解决本地不安装oracle,PLsql远程连接. 1.首先到Oracle网站下载Instant Client : http://www.ora ...

  6. 【Oracle+PHP】php连接oracle设定字符集,避免乱码

    数据库用oracle,当php连接oracle的时候,最好指定字符集. 查PHP手册,oci_connect的第四个参数为charset,这是关键. 首先获取oracle的字符集,运行“select ...

  7. java oracle thin 和 oci 连接方式实现多数据库的故障切换

    java oracle thin 和 oci 连接方式实现多数据库的故障切换 一.thin方式 该种方式简便易用非经常见. 当中URL为 jdbc:oracle:thin:@(DESCRIPTION= ...

  8. ORACLE无法删除当前连接用户

    今天在做Oracle数据库是遇到ORACLE无法删除当前连接用户 ,经查找可用如下方法解决 . 在Oracle中删除用户时提示:ORACLE无法删除当前连接用户  可以用以下语句    Sql代码   ...

  9. oracle的本地远程连接和配置

    Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍. 第一种情况: 若oracle服务器装在本机上,那就不多说了, ...

随机推荐

  1. How could I create a custom windows message?

    [问题] Our project is running on Windows CE 6.0 and is written in C++ . We have some problems with the ...

  2. mysql CAPI 接口 读取中文乱码的解决方案(转)

      最近的yymysqlsdk的开源项目里,对中文的支持不到位,因此用了1.5天的时间,对中文处理的各个情况进行了分析.     1.首先确认你的MySQL配置文件,my.ini (只针对window ...

  3. hadoop集群配置SSH免登陆

    今天给大家总结一下hadoop集群之间免登陆的步骤 node1 ssh node4 1.在node1中生成密钥 [root@node1 ~]# ssh-keygen -t dsa -P '' -f ~ ...

  4. Red Hat Enterprise Linux AS release 4 yum源

    $sudo vim /etc/yum.conf [main] cachedir=/var/cache/yum debuglevel=2 logfile=/var/log/yum.log pkgpoli ...

  5. 一个十年IT从业者的职场感言:为什么不要自称是“程序员”

    转载:https://blog.csdn.net/S_king_/article/details/78529089 如果我可以给每个工程教育增加一门课,它不会涉及编译器.门电路或是时间复杂度,而是一门 ...

  6. DELL平板如何安装WIN10系统 -PE启动问题

    开机按F2可以进入BIOS设置,如果你的系统已经被删了,则开机会自动进入检查程序   进入BIOS之后,可以看到如果改成Legancy,默认第一启动方式是Internal HDD   我如果重装系统, ...

  7. ZH奶酪:基于ionic.io平台的ionic消息推送功能实现

    Hybrid App越来越火,Ionic的框架也逐渐被更多的人熟知. 在mobile app中,消息推送是很必要的一个功能. 国内很多ionic应用的推送都是用的极光推送,最近研究了一下Ionic自己 ...

  8. (转)pip和easy_install使用方式

    easy_install 跟 pip 都是 Python 的套件管理程式,有了它們,在使用 Python 開發程式的時候會帶來不少方便. easy_install 和 pip 有什麼不一樣?據 pip ...

  9. Android 在闹钟开机时,如何解决开机动画没有播完就进入Launcher M

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  10. 一次性解决Intellij IDEA maven 自动跳到1.5的JDK

    说明:文章学习自:https://blog.csdn.net/Zereao/article/details/77427989 一.找到Setting.xml文件 打开setting.xml 说明,该文 ...