• oracle中联表相关思考


    联表的核心在于发掘各个表之间内在或隐含的联系,利用这些联系将表联系起来

    笛卡尔积(“所有连接的基础”)

    不找表之间关系,仅仅是将A表与B表数据进行一个简单的贴合

    --该语句无任何实际意义因其数据量小故选择该表作为演示之用
    select * from deopt d1,dept d2;
    
    • 1
    • 2

    在这里插入图片描述
    根据查询到的结果我们不难发现笛卡尔积是拿d1表中的每一条数据去跟d2表的每一条数据进行连接,其结果行数列数如下:

    • 联表之后的数据列数为表d1+表d2的列数之和
    • 联表之后的数据行数为表d1*表2的行数之积

    用户可将内连接、自连接、外连接均理解为是带where条件的笛卡尔积,此处的条件就是各个表之间的联系,例如两个表中相同的列了,又比如一个表中数据是在另一个表两个列之间的范围之中了

    举个栗子吧,emp表中每个员工都有所属部门,dept表中每个部门同样有部门编号该列,又比如,emp表中工资列是处在salgrade表中losal和hisal之间的数

    内连接

    内连接是只显示符合连接条件的数据

    --连接emp表与dept表
    select * from emp e,dept d where e.deptno=d.deptno;
    select * from emp e inner join dept d on e.deptno=d.deptno;
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    上述两条语句等效,在此重点说一下where的执行逻辑:

    • 首先from emp e,dept d产生两表的笛卡尔积
    • 根据where条件对产生的数据进行筛选
    • 根据select之后from之前的列名显示需要展示的列

    自连接

    自连接是表与表本身有某种联系,需要将本表从形式上看作两个表连接的一种内连接

    举个例子吧,emp表中有empno和mgr两个列,当我们把empno看作主键的时候,该表实际意义可以看作员工表;当我们把mgr看作主键的时候,该表的实际意义可以看作上级领导表

    --自连接emp
    select * from emp 员工表,emp 领导表 where 员工表.mgr=领导表.empno;
    select * from emp 员工表 inner join emp 领导表 on 员工表.mgr=领导表.empno;
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    外连接

    (1)左外连接——左表中有与右表匹配不上的数据时候,左表数据仍然显示,右表中该条数据全用null代替

    --左外连接emp、dept表
    select * from emp e,dept d where d.deptno(+)=e.deptno;
    select * from emp e left outer join dept d on d.deptno=e.deptno;
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    (2)右外连接——右表中有与左表匹配不上的数据时候,右表数据仍然显示,左表中该条数据全用null代替

    --右外连接emp、dept表
    select * from emp e,dept d where d.deptno=e.deptno(+);
    select * from emp e right outer join dept d on d.deptno=e.deptno;
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    (3)全外连接——左外右外连接的一个综合

    --全外连接emp、dept表
    select * from emp e full outer join dept d on d.deptno=e.deptno;
    
    • 1
    • 2

    在这里插入图片描述

    自然连接(“全自动”)

    不用用户指定字段,全自动匹配相应字段

    --自然连接emp与dept
    select * from emp natural join dept;
    
    • 1
    • 2

    在这里插入图片描述

    不等连接

    不等连接与等值连接的区别在于两个表连接条件的不同,等值连接的联表条件为等于,不等连接的联表条件不能为等于

    --连接emp与salgrade表
    select * from emp e,salgrade s where e.sal between s.losal and s.hisal;
    select * from emp e inner join salgrade s on e.sal between s.losal and s.hisal;
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  • 相关阅读:
    手把手教你Nginx常用模块详解之ngx_http_addition_module(二)
    泛型类01
    fmx windows 下 制作无边框窗口最小化最大化并鼠标可拖移窗口
    商业化广告--体系学习-- 10 -- 业务实战篇 -- 效果优化:如何一步步从提升曝光量深入到提升销量?
    Kafka Connect的内部结构和故障处理
    ::before 和 :after中双冒号和单冒号有什么区别?解释一下这2个伪元素的作用
    golang 发起 http 请求,获取访问域名的 ip 地址(net, httptrace)
    微服务 ZooKeeper ,Dubbo ,Kafka 介绍应用
    【C++】list的使用(上)
    Docker从入门到上天系列第四篇:docker平台入门图解与平台架构图解
  • 原文地址:https://blog.csdn.net/weixin_51371629/article/details/126219120