首页 > 其他分享 >多表连接

多表连接

时间:2022-11-18 19:34:53浏览次数:43  
标签:主表 多表 -- 员工 emp 查询 连接

图片

1.1 多表连接查询的概念

  • 由于数据库中很多数据被分散到多个数据库表中。在查询数据时就经常出现要查的数据来自多个表中,此时就必须采用多表连接查询。多表连接查询是数据库查询中常见的查询方式。
  • 多表连接查询分为内连接和外连接。

1.2 内连接的概念

  • 内连接就是两张表处于同等地位,只显示两张表能够匹配上的记录。
  • 内连接主要方式:
    • 等值连接,连接条件为两个或者多个表的字段相等,大多数多表连接查询是等值连接。
    • 非等值连接,连接条件不是两个或者多个表的字段相等,而是其他运算符(>,<,>=,<=,<>,between and等)。
    • 自连接,用别名将一个表看成两张表进行多表连接。

1.3 外连接的概念

  • 外连接有主表和副表的区别,两张表中有一张表是主表,另一张表是副表,主要查询主表中的数据(主表的数据一定会显示),匹配查询副表,当副表中的数据没有和主表中的数据匹配时,副表自动模拟出null与之匹配。
  • 外连接主要方式:
    • 左外连接,左边的表是主表,主表的意思是左边的表数据不会为空,但是可能会重复,查出的数据可能比主表的行数还要多。
    • 右外连接,右边的表是主表。
    • 全外连接,两边都是主表(基本用不到)。

1.4 案例说明

  • 接下来以oracle数据库中scott用户下emp(员工表)和dept(部门表)以及salgrade(薪水等级表)为例,解析一下多表连接查询对应的SQL语句。
  • 其中emp(员工表)表结构和表数据如下:
SQL> desc emp; 
 Name                       Null?    Type
 ----------------------------------------- -------- --------------

 EMPNO                      NOT NULL NUMBER(4)     -- 员工编号
 ENAME                               VARCHAR2(10)  -- 员工姓名
 JOB                                 VARCHAR2(9)   -- 员工职位
 MGR                                 NUMBER(4)     -- 员工领导
 HIREDATE                            DATE          -- 入职日期
 SAL                                 NUMBER(7,2)   -- 员工薪水
 COMM                                NUMBER(7,2)   -- 员工提成
 DEPTNO                              NUMBER(2)     -- 部门编号

图片

  • 其中dept(部门表)表结构和表数据如下:
SQL> desc dept;
 Name                       Null?    Type
 ----------------------------------------- -------- --------------

 DEPTNO                     NOT NULL NUMBER(2)      -- 部门编号
 DNAME                               VARCHAR2(14)   -- 部门名称
 LOC                                 VARCHAR2(13)   -- 办公地点

图片

  • 其中salgrade(薪水等级表)表结构和表数据如下:
SQL> desc salgrade;
 Name                       Null?    Type
 ----------------------------------------- -------- ----------

 GRADE                               NUMBER        -- 等级编号
 LOSAL                               NUMBER        -- 最低薪水
 HISAL                               NUMBER        -- 最高薪水

图片

1.4.1 交叉查询

  • 交叉查询没有任何实际意义,得到的是2张表的笛卡尔积,也就是让表1的每一项都组合表2的每一项:笛卡尔乘积现象(没有条件限制),结果条数是2张表记录条数的乘积。
select e.ename,d.dname from emp e,dept d; 
  • 使用第一张表的第一条记录和第二张表的每一条记录都匹配,然后第一张表的每一条记录也一样去找表2的每一条记录进行匹配。
  • 如果不用别名,若两张表存在一模一样的字段时,会出现混淆。
        图片

1.4.2 内连接查询

(1)如何避免笛卡尔积现象

  • 加条件进行过滤。避免了笛卡尔积现象,会减少记录的匹配次数吗?不会,次数还是56次。只不过显示的是有效记录。

(2)内连接查询

  • 内连接之等值连接:最大特点是:条件是等量关系。
  • 案例:查询每个员工的部门名称,要求显示员工名和部门名。
-- 语法太老,基本不用了
SQL92: select e.ename,d.dname 
         from emp e,dept d 
           where e.deptno=d.deptno;
-- 常用,inner可以省略,带着inner目的是可读性好一些。
SQL99: select e.ename,d.dname 
         from emp e inner join dept d 
           on e.deptno=d.deptno;
  • 语法:… A join B on 连接条件 where 查询条件;

  • 表连接的条件和数据进行过滤的where条件进行分离。语法结构更清晰。
    图片

  • 内连接之非等值连接的最大特点是:连接条件中的关系是非等量关系。

  • 案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级。

select e.ename, e.sal, s.grade 
  from emp e join salgrade s 
    on e.sal between s.losal and s.hisal;

图片

  • 自连接:最大的特点是:一张表看做两张表。自己连接自己。
  • 案例:找出每个员工的上级领导,要求显示员工名和对应的领导名,希望mgr显示的是领导名,而不是编号。
  • 其实都是同一张表,员工的领导编号=领导的员工编号。(核心点,在于找这个等量关系)。
select a.ename as ‘员工名’, b.ename as ‘领导名’ 
  from emp a inner join emp b 
    on a.mgr=b.empno;

图片

1.4.3 外连接查询

  • 外连接最重要的特点是:主表的数据无条件的全部查询出来。
  • 左连接有右连接的写法,右连接也会有对应的左连接的写法。
  • 案列:找出每个员工的上级领导?(所有员工必须全部查询出来。)
-- 外连接(左):outer可以省略。
select a.ename ‘员工’, b.ename ‘领导’ 
  from emp a left outer join emp b 
    on a.mgr=b.empno;
-- 外连接(右):
select a.ename ‘员工’, b.ename ‘领导’ 
  from emp b right outer join emp a 
    on a.mgr=b.empno;

图片

更多精彩欢迎关注微信公众号《格子衫007》!

图片

标签:主表,多表,--,员工,emp,查询,连接
From: https://www.cnblogs.com/gezishan007/p/16904687.html

相关文章

  • Doris同步多库多表
    官方的东西抽象到技术层面,跟具体的业务有点脱节,我们需要下沉封装,而不是削足适履。引言  Doris用多了,把一些坑都免疫了,遇到就知道不该跳,就像spark/flink的算子调优一样,还用......
  • windows远程连接centos及闪退异常解决记录
      平时在学校实验室写代码用的环境是linux系统,放假回家之后之后笔记本的性能和系统多少有些不方便,因此使用服务器安装IDEA进行编程,记录一下远程桌面的安装及出现的......
  • 关于VMware的将主机虚拟适配器连接到次网络无法选中的问题
    这个问题的原因可能是,你之前卸载VMware的时候,没有卸载完全,所以注册表还存在一些相关的垃圾这里需要用到CCleaner  然后就可以勾上了  ......
  • 配置OSPF虚连接示例
    介绍通过配置虚连接使非骨干区域与骨干区域连通的过程。组网需求在下图中,Area2没有与骨干区域Area0直接相连。Area1被用作传输区域(TransitArea)来连接Area2和Area0。Rout......
  • Arcgis热连接照片等
    1、添加字段并编辑字段路径2、设置超链接字段3、用超链接工具浏览弹出路径下的照片......
  • JProfiler远程连接Linux服务器
    1.下载、解压、上传Linux安装包下载地址https://download-gcdn.ej-technologies.com/jprofiler/jprofiler_linux_11_1_4.tar.gz下载解压后,上传到Linux服务器2.运行Serv......
  • [Huawei] 在 DevEco 中使用 IP Connect 连接手机
    背景DevEcoStudio3.1.0.100HUAWEIMate50步骤1.手机进入开发者模式,启用"允许USB调试"2.用USB数据线连接电脑和手机3.在电脑上,DevEco/HarmonyOS/SDK目录......
  • MySQL中的多表操作
    MySQL多表操作1、联合查询联合查询:union,是指将多个查询结果合并成一个结果显示,联合查询是针对查询结果的合并(多条select语句合并)基本语法select查询[决定字段......
  • springboot 连接 redis 超时以及无法连接的解决方案
    连接的时候遇到了两个问题:一是超时,二是连接不上。网上看到了很多方法,但是比较杂乱,新手不是很懂问题出在哪里,所以写了一下自己的解决问题的心得。超时超时的原因:1.保护模......
  • grafana连接influxdb1.8报错“error connection influxDB influxQL”
    influxdb配置没问题,grafana配置也没问题报错原因:influxdb的数据库中没有数据,连接会报这个错,当有数据时再测试连接就会正常了......