Oracle  外连接

(1)左外连接 (左边的表不加限制)
       (2)右外连接(右边的表不加限制)
       (3)全外连接(左右两表都不加限制)

外连接(Outer Join)

outer
join则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。外连接分为三种:
左外连接,右外连接,全外连接。 对应SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我们省略outer 这个关键字。
写成:LEFT/RIGHT/FULL JOIN。

在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。 如果基表的数据在另一张表没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。

对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:
       1.(+)操作符只能出现在where子句中,并且不能与outer join语法同时使用。
       2. 当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符
       3.(+)操作符只适用于列,而不能用在表达式上。
       4.(+)操作符不能与or和in操作符一起使用。
       5.(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。

在做实验之前,我们先将dave表和bl里加一些不同的数据。 以方便测试。

SQL> select * from bl;

ID NAME

---------- ----------

1 dave

2 bl

3 big bird

4 exc

9 怀宁

SQL> select * from dave;

ID NAME

---------- ----------

8 安庆

1 dave

2 bl

1 bl

2 dave

3 dba

4 sf-express

5 dmm

2.1 左外连接(Left outer join/ left join)

left
join是以左表的记录为基础的,示例中Dave可以看成左表,BL可以看成右表,它的结果集是Dave表中的数据,在加上Dave表和BL表匹配的数据。换句话说,左表(Dave)的记录将会全部表示出来,而右表(BL)只会显示符合搜索条件的记录。BL表记录不足的地方均为NULL.

示例:

SQL> select * from dave a left join bl b on a.id = b.id;

ID NAME               ID NAME

--------- ---------- ---------- ----------

1 bl                  1 dave

1 dave                1 dave

2 dave                2 bl

2 bl                  2 bl

3 dba                 3 big bird

4 sf-express          4 exc

5 dmm                             -- 此处B表为null,因为没有匹配到

8 安庆                             -- 此处B表为null,因为没有匹配到

SQL> select * from dave a left outer join bl b on a.id = b.id;

ID NAME               ID NAME

---------- ---------- ---------- ----------

1 bl                  1 dave

1 dave                1 dave

2 dave                2 bl

2 bl                  2 bl

3 dba                 3 big bird

4 sf-express          4 exc

5 dmm

8 安庆

用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在右表,左表就是全部显示,故是左连接。

SQL> Select * from dave a,bl b where a.id=b.id(+);    -- 注意: 用(+) 就要用关键字where

ID NAME               ID NAME

---------- ---------- ---------- ----------

1 bl                  1 dave

1 dave                1 dave

2 dave                2 bl

2 bl                  2 bl

3 dba                 3 big bird

4 sf-express          4 exc

5 dmm

8 安庆

2.2 右外连接(right outer join/ right join)

和left join的结果刚好相反,是以右表(BL)为基础的, 显示BL表的所以记录,在加上Dave和BL 匹配的结果。 Dave表不足的地方用NULL填充.

示例:

SQL> select * from dave a right join bl b on a.id = b.id;

ID NAME               ID NAME

---------- ---------- ---------- ----------

1 dave                1 dave

2 bl                  2 bl

1 bl                  1 dave

2 dave                2 bl

3 dba                 3 big bird

4 sf-express          4 exc

9 怀宁    --此处左表不足用Null 填充

已选择7行。

SQL> select * from dave a right outer join bl b on a.id = b.id;

ID NAME               ID NAME

---------- ---------- ---------- ----------

1 dave                1 dave

2 bl                  2 bl

1 bl                  1 dave

2 dave                2 bl

3 dba                 3 big bird

4 sf-express          4 exc

9 怀宁  --此处左表不足用Null 填充

已选择7行。

用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。所以加号写在左表,右表就是全部显示,故是右连接。

SQL> Select * from dave a,bl b where a.id(+)=b.id;

ID NAME               ID NAME

---------- ---------- ---------- ----------

1 dave                1 dave

2 bl                  2 bl

1 bl                  1 dave

2 dave                2 bl

3 dba                 3 big bird

4 sf-express          4 exc

9 怀宁

2.3 全外连接(full outer join/ full join)

左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充。 全外连接不支持(+)这种写法。

示例:

SQL> select * from dave a full join bl b on a.id = b.id;

ID NAME               ID NAME

---------- ---------- ---------- ----------

8 安庆

1 dave                1 dave

2 bl                  2 bl

1 bl                  1 dave

2 dave                2 bl

3 dba                 3 big bird

4 sf-express          4 exc

5 dmm

9 怀宁

已选择9行。

SQL> select * from dave a full outer join bl b on a.id = b.id;

ID NAME               ID NAME

---------- ---------- ---------- ----------

8 安庆

1 dave                1 dave

2 bl                  2 bl

1 bl                  1 dave

2 dave                2 bl

3 dba                 3 big bird

4 sf-express          4 exc

5 dmm

Oralce sql (+) 补充的更多相关文章

  1. 031医疗项目-模块三:药品供应商目录模块——供货商药品目录查询功能----------sql补充知识

    这个补充知识有一个点很有必要,视屏上的老师提出一点: 内链接关联查询: 如果表A和表B有一个外键关联 ,可以通过外键进行内链接查询 select dictinfo.*, dicttype.typena ...

  2. SQL补充

    TOP 子句TOP 子句用于规定要返回的记录的数目.对于拥有数千条记录的大型表来说,TOP 子句是非常有用的.注释:并非所有的数据库系统都支持 TOP 子句.SELECT TOP 2 * FROM P ...

  3. Python学习—数据库篇之SQL补充

    一.SQL注入问题 在使用pymysql进行信息查询时,推荐使用传参的方式,禁止使用字符串拼接方式,因为字符串拼接往往会带来sql注入的问题 # -*- coding:utf-8 -*- # auth ...

  4. Java学习笔记35(sql补充)

    在上一篇里,写了数据库的增删该查,没有写完,这里补充 CREATE DATABASE Zs_Base; USE Zs_Base; # 创建表 CREATE TABLE PRODUCT( ID INT ...

  5. 【java/oralce/sql】往一张仅有id,名称,创建时间三个字段的表中插入百万数据需要多久?1分26秒

    代码下载:https://files.cnblogs.com/files/xiandedanteng/fastfilltable20191222.rar 表testtb18的结构如下: CREATE ...

  6. oralce sql 分页

    create table student ( sid varchar2(10), --学号 sname varchar2(10), --姓名 classid varchar2(10), --班级号 s ...

  7. oralce sql 创建指定时间段内的日历信息

    -- Create table create table TEMP_CALENDAR (   MONTH VARCHAR2(6),   W_7   VARCHAR2(2),   W_1   VARCH ...

  8. SqlServer和Oracle中一些常用的sql语句3 行列转换

    --217, SQL SERVER SELECT Cust_Name , MAX(CASE WHEN Order_Date ='2009-08-01' THEN AR END) "2009- ...

  9. sql server行列转化和行列置换

    行列转换: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 想变成(得到如下结果): 姓名 语文 数学 物理 ---- - ...

随机推荐

  1. 【AtCoder】AGC014

    AGC014 链接 A - Cookie Exchanges 发现两个数之间的差会逐渐缩小,所以只要不是三个数都相同,那么log次左右一定会得到答案 #include <bits/stdc++. ...

  2. Python学习(二十) —— 前端之CSS

    转载自http://www.cnblogs.com/liwenzhou/p/7999532.html 一.CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTM ...

  3. unitest框架--认识与基本使用

    1.import unitest------套路1,必须导入!! 2.#创建测试类--------------------套路2,测试名自取,最好首字母大写,必须继承unitest下的Testcase ...

  4. sublime text 自定义插件,自动插入署名,自定义插入日期,自动生成头部注释

    自动插入署名 菜单下面的 一.工具(tool)>新代码段(new snippet…) 看到以下代码 <snippet> <content><![CDATA[ Hel ...

  5. 20165235 学习基础和C语言基础调查

    20165235 学习基础和C语言基础调查 首先第一个问题:你有什么技能比大多人(超过90%以上)更好?感觉很难回答这种问题,其实我对很多东西挺感兴趣的,如果非要拿出一种比较突出的技能的话我感觉就是象 ...

  6. CentOS7 中文man(cman)配置方法

    1. 下载中文man包 http://pkgs.fedoraproject.org/repo/pkgs/man-pages-zh-CN/manpages-zh-1.5.1.tar.gz/13275fd ...

  7. NIO编程---通道(Channel)

    **版权声明:本文为小斑马伟原创文章,转载请注明出处! 通道(Channel):由java.nio.channels 包定义的.Channel 表示IO 源与目标打开的连接.Channel 类似于传统 ...

  8. groupadd 创建组

    groupadd 创建组 1 注意 :root用户才有权使用这个命令 2 groupadd -g 744 cjh  指定组ID号 3 在/etc/passwd 产生一个 组ID GID gpasswd ...

  9. CCF-学生排队

    PS:此文章已在我的站点更新,请移步访问~更多注释讲解哦.https://www.jeson.xin/ccf-student_queuing.html

  10. IDEA常用配置

    一.安装Activiti 1.File -> Settings -> Plugins -> 搜索actiBPM 2.解决中文乱码问题 修改IDEA的安装目录中的idea.exe.vm ...