• 数据库中的连接查询


    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;
    

    在这里插入图片描述

  • 相关阅读:
    日积月累flex4细节上的改变
    flex3:dragdrop全攻略(二)
    理解自定义组件
    两个mxml页面的跳转问题
    日积月累12个flex常用功能代码(转载)
    flex开源工具整理
    二叉树学习(上)
    实现数据库同步备份 过程结果分析
    ASP.NET服务器对于请求的处理过程
    C#泛型
  • 原文地址:https://www.cnblogs.com/yu011/p/13286353.html
Copyright © 2020-2023  润新知