zoukankan      html  css  js  c++  java
  • 数据库中的连接查询

    1、概述
    2、连接查询原理及笛卡尔积现象
    3、内连接
    ---3.1等值连接
    ---3.2非等值连接
    ---3.3自连接
    4、外连接
    ---4.1概述
    ---4.2例子
    5、三张表以上的连接查询
    ---5.1大致语法
    ---5.2例子

    概述

    1、在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果。一个业务都会对应多张表,比如:学生和班级,起码两张表。(避免产生数据的冗余)
    2、连接查询的分类
    ①根据语法出现的年代来划分:
    SQL92(一些老的DBA可能还在使用这种语法。)
    SQL99(比较新的语法)
    ②根据表的连接方式来划分:
    内连接:等值连接、非等值连接、自连接。
    外连接:左外连接(左连接)、右外连接(右连接)、全连接。

    连接查询原理及笛卡尔积现象

    (以下属于SQL92)

    • 笛卡尔积现象
      1、在表的连接查询方面有一种现象被称为:笛卡尔积现象。
      2、例子:找出每一个员工的部门名称,要求显示员工名和部门名。
      emp表:
      emp表
      dept表:
      dept表
    SELECT e.ENAME, d.dname 
    FROM emp e, dept d;
    

    (从e表中拿一个ENAME与d表中的所有dname一一匹配)
    在这里插入图片描述
    3、查询出来的结果有56条(14*4)。当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。这就是笛卡尔积现象。
    4、关于表的别名的优点:执行效率高;可读性好。

    • 如何避免笛卡尔积现象?
      加条件进行过滤,还有会查56条,但只会显示有效记录。
    SELECT e.ename, d.dname 
    FROM emp e, dept d
    where e.DEPTNO = d.DEPTNO;
    

    在这里插入图片描述

    内连接

    等值连接
    • 内连接之等值连接
      最大的特点是:条件是等量关系。
    • SQL99(最常用)
    SELECT e.ename, d.dname 
    FROM emp e
    join dept d
    on e.DEPTNO = d.DEPTNO;
    

    1、语法:

    ...
       A
    (inner) join
       B
    on
       连接条件
    where
       ...
    

    inner可省略,加上可读性更强
    2、SQL99语法结构更清晰一些,表的连接条件和后来的where条件分离了。

    非等值连接
    • 内连接之非等值连接
      最大的特点是:连接条件中的关系是非等量关系。
    • 例子:
      找出每个员工的工资等级,要求显示员工名、工资、工资等级。
    SELECT e.ename, e.sal, s.grade 
    FROM 
    emp as e
    inner join 
    salgrade as s
    on 
    e.sal between losal and hisal
    order by grade;
    

    在这里插入图片描述

    自连接
    • 自连接
      自连接就是一张表看做两张表,自己连接自己。
    • 例子:
      找出每个员工的上级领导,要求显示员工名和对应的领导名。
      emp表:
      在这里插入图片描述
      关键:
      一张表起两个别名,当做两张表用。
      员工的领导编号 = 领导的员工编号。
    SELECT a.ename as emp, 
    b.ename as mgr
    from emp as a
    inner join 
    emp as b
    on a.mgr = b.empno;
    

    在这里插入图片描述

    外连接

    概述
    • 内连接和外连接的区别
      1、内连接:
      假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。AB两张表没有主副之分,两张表是平等的。
      2、外连接:
      假设A和B表进行连接,使用外连接的话, AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表。当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
      3、外连接的分类:
      左外连接(左连接):表示左边的这张表是主表。
      右外连接(右连接):表示右边的这张表是主表。
      4、左连接有右连接的写法,右连接也会有对应的左连接的写法。
      5、外连接最重要的特点是:主表的数据无条件的全部查询出来。
    例子

    1、找出每个员工的上级领导,要求显示员工名和对应的领导名。

    • 左连接:
    SELECT a.ename as emp, 
    b.ename as mgr
    from emp as a
    left outer join 
    emp as b
    on a.mgr = b.empno;
    

    outer可以省略
    在上面内连接的基础上将inner换为left (outer),emp as a表示左边,emp as b表示右边;因为是left,所以左边的a为主表。b为副表。

    • 右连接
    SELECT a.ename as emp, 
    b.ename as mgr
    from emp as b
    right outer join 
    emp as a
    on a.mgr = b.empno;
    

    outer可以省略
    这时emp as b表示左边,emp as a表示右边;right表示右边的a为主表。b为副表。
    在这里插入图片描述
    上述结果中虽然KING没有上级,但是有null与之匹配。(内连接就没有)
    2、找出哪个部门没有员工?

    SELECT dept.*
    FROM emp
    right outer join
    dept
    on 
    emp.deptno = dept.deptno
    where
    emp.empno is null;
    

    在这里插入图片描述

    三张表以上的连接查询

    大致语法
    ...
         A
    inner join 
         B
    on
    ...
    inner join 
         C
    on
    ...
    

    表示:A表和B表先进行表连接,连接之后A表继续和c表进行连接。

    例子

    找出每一个员工的部门名称以及工资等级、领导。

    SELECT e.ename emp, d.dname, s.grade, ee.ename mgr
    FROM emp e
    inner join dept d
    on e.deptno=d.deptno 
    inner join salgrade s
    on e.sal between s.losal and s.hisal
    left join emp ee
    on e.mgr=ee.empno;
    

    在这里插入图片描述

  • 相关阅读:
    Oracle Core 学习笔记二 Transactions 和 Consistency 说明
    Oracle AUTO_SPACE_ADVISOR_JOB 说明
    Windows 下 ftp 上传文件 脚本
    Oracle 11g 中 Direct path reads 特性 说明
    Linux 使用 wget 下载 Oracle 软件说明
    Oracle 10g read by other session 等待 说明
    Oracle 11g RAC INS06006 Passwordless SSH connectivity not set up between the following node(s) 解决方法
    SecureCRT 工具 上传下载数据 与 ASCII、Xmodem、Ymodem 、Zmodem 说明
    Oracle RAC root.sh 报错 Timed out waiting for the CRS stack to start 解决方法
    Oracle RESETLOGS 和 NORESETLOGS 区别说明
  • 原文地址:https://www.cnblogs.com/yu011/p/13286353.html
Copyright © 2011-2022 走看看