一、问题描述

  有时我们为了保留某个表中的数据,而该表中的数据在另外一个关联表中未必都存在对应,此时就应该试用外连接查询。

  比如:两个表,产品表和子产品表

注:子产品的parent_product_id便是产品表的id

  产品可以有子产品,也可以没有子产品

  遇到类似的问题需要使用外连接查询,保证所有的产品被查询出来,而其对应的子产品也在查询结果中。

二、问题解决

  1.基础概念

    笛卡尔积:例如,A={a,b}, B={0,1,2},则

         A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
         B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

    即,一个集合在左和在右做“笛卡尔积”结果是不同的。

  2.外连接查询

    2.1左外连接查询

select *
from table_a a left join table_b b
on a.id = b.parent_id

这样的结果就是左边的表中的内容都会被保留,而右边表每条数据会对应左边表中对应的数据,结果中,右边表中的所有内容只出现一次(table_a和table_b是一对多关系,且table_b中记录只对应一个table_a中记录),而左边表中一条记录可能显示多次。

e.g.

select pp.product_id,pp.product_name,p.product_id,p.product_name
from edu_product pp--产品
left join sub_edu_product p--子产品
on pp.product_id = p.parent_product_id;

    2.2右外连接

select *
from table_a a right join table_b b
on a.id = b.parent_id

这样的结果就是右边的表中的内容都会被保留,而右边表每条数据会对应左边表中对应的数据,结果中,右边表中的所有内容只出现一次(table_a和table_b是一对多关系,且table_b中记录只对应一个table_a中记录),而左边表中一条记录可能显示多次。和左外连接的区别是,左表不会保留多出来的数据

e.g.

select pp.product_id,pp.product_name,p.product_id,p.product_name
from edu_product pp--产品
right join sub_edu_product p--子产品
on pp.product_id = p.parent_product_id;

三、补充

  试用外连接查询时有时会有一些疑问,总结在下面:

  试用oracle中emp和dept表做示例

dept:

emp:

1.相同的左外连接查询得到不同的展示结果

select dept.deptno,dept.dname,
emp.ename,emp.empno
from dept left join emp
on dept.deptno = emp.deptno;

select emp.ename,emp.empno,
dept.deptno,dept.dname
from dept left join emp
on dept.deptno = emp.deptno;

结论:红色部分完全相同,说明外连接方向及条件一样,区别在查询的字段排序不同,导致结果不同。

   而第二种结果不能代表此次查询是右外连接

2.on条件上等号左右字段颠倒,效果是否相同

select dept.deptno,dept.dname,
emp.ename,emp.empno
from dept left join emp
on dept.deptno = emp.deptno;

select dept.deptno,dept.dname,
emp.ename,emp.empno
from dept left join emp
on emp.deptno = dept.deptno;

结论:对比结果发现,没有任何区别

3.使用+号进行外连接查询

select *
from (select e.empno,e.ename,d.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno) s, emp_dept ed
where ed.empno(+) = s.empno;

  emp_dept表中存放了emp,dept连接查询的部分结果。所以,s表包含了ed表中的所有内容

  +放置的位置:哪面少哪面用+号,或者说哪面可能出现空记录,哪面用+号

oracle——外连接查询的更多相关文章

  1. 【学亮开讲】Oracle内外连接查询20181119

    --内连接查询 --需求:查询显示业主编号.业主名称.业主类型名称 select os.id 业主编号,os.name 业主名称,ot.name 业主类型名称 from t_owners os,t_o ...

  2. SubSonic3.0使用外连接查询时查询不出数据的问题修改

    今天在开发时,要使用到外连接查询,如图 老是查不出数据,所以就追踪了一下代码,发现查询后生成的SQL语句变成了内连接了,真是晕 然后继续Debug,发现原来SqlQuery类在调用LeftInnerJ ...

  3. oracle 外连接以及用on和where 的区别

    Oracle  外连接(OUTER JOIN)包括以下: 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/FULL OUT ...

  4. mysql——多表——外连接查询——左连接、右连接、复合条件查询

    ), d_id ), name ), age ), sex ), homeadd ) ); ,,,'nan','beijing'); ,,,'nv','hunan'); ,,,'nan','jiang ...

  5. mysql 内连接和外连接查询

    一.内连接查询 (笛卡儿积) 内联接查询inner join,mysql可以简写为join 二.外连接查询 左外联接查询left outer join,mysql可以简写为left join右外联接查 ...

  6. oracle 内连接 外连接 查询 笔记

    elect ename,job,sal from emp where deptno>10 order by sal desc; 联合查询,PK dept.deptno FK emp.deptno ...

  7. Oracle 外连接和 (+)号的用法

    对于外连接,Oracle中可以使用“(+)”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN,下面将配合实例一一介绍.1. LEFT OUTER JOIN:左外关联 SELEC ...

  8. mysql常用基础操作语法(九)~~外连接查询【命令行模式】

    1.左外连接left outer join或者left jion,outer可以省略不写,下边的右连接和全连接也一样: 左外连接的意思是,以left join左边的表中的数据为基准,即左边的表中有的必 ...

  9. Mysql学习总结(25)——MySQL外连接查询

    1.左外连接left outer join或者left jion,outer可以省略不写,下边的右连接和全连接也一样: 左外连接的意思是,以left join左边的表中的数据为基准,即左边的表中有的必 ...

随机推荐

  1. Cocos2d-JS加速度计与加速度事件

    在很多移动设备的游戏使用到了加速度计,Cocos2d-JS引擎提供了访问加速度计传感器的能力.本节我们首先介绍一下加速度计传感器,然后再介绍如何在Cocos2d-JS中访问加速度计.加速度计加速度计是 ...

  2. XibDemo

    ////  MyviewViewController.h//  XibDemo////  Created by hehe on 15/9/21.//  Copyright (c) 2015年 wang ...

  3. Linux基本服务命令

    启动Httpd服务:service httpd start 停止Httpd服务:service httpd stop 重启Httpd服务:service httpd restart 关闭httpd所有 ...

  4. 《CSS3秘笈》备忘录

    第一部分 1.  类名称区分大小写:.special和.SPECIAL不一样 2.  :focus 是通过单击或跳格集中在某个地方 3.  ::selection 没有单冒号,被选中的文本[ 但是在I ...

  5. 数据挖掘:Weka代码学习

    在Eclipse中配置Weka,在Eclipse中新建一个Java Project,然后在Eclipse的Resource目录中,在新new的Project上右键选择Build Path中选择add ...

  6. C#打开mdb文件,获取文件下的所有表格,以及获取表格下的所有字段

    String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|aspxWeb2 ...

  7. MVC校验

    首先Model里面需要写好校验标签, 我的数据库中有个tblUserInfo表,其中有Id,UserName,,Age三个列,Id自动增长 Model添加UserInfo Class,在UserNam ...

  8. 在linux下查看内核版本、gcc版本、操作系统多少位等参数

    1. 查看linux版本 cat /etc/issue Ubuntu 11.04 \n \l 2. 查看内核版本 1)cat /proc/version Linux version 2.6.38-13 ...

  9. CMD规范的函数与普通函数间调用

    /* * a.js * 普通的非cmd规范的js文件 */ function fun1(){ console.log("fun1"); //调用seajs模块中的fun1 seaj ...

  10. [大牛翻译系列]Hadoop(12)MapReduce 性能调优:诊断硬件性能瓶颈

    6.2.5 硬件性能问题 尽管单独的硬件的MTTF(平均失效前时间)都数以年记,然而在集群中就完全不是这么一回事了.整个集群的MTTF就要小得多.这一节要介绍如何确定CPU,内存,磁盘和网络是否过度利 ...