zoukankan      html  css  js  c++  java
  • 清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

    直入主题:

    我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象?

    使用内连接,查询数据

    问题:找不到SCOTT员工了,只有13条数据,这显然不合理;这就是内连接的缺点

    -- 内连接:只显示匹配的数据
    -- 外连接:显示匹配的数据,还显示(部分或者全部)不匹配的数据,那就是显示(全部)的数据

    (1)左外连接:left join

    特点:左表全部显示,包括不匹配的数据,右表进行匹配显示

    (2)右外连接:right join

    右表全部显示,包括不匹配的数据,左表进行匹配显示

    (3)全外连接

    左表和右表的数据都会显示,包括不匹配的数据

    注意:在oracle中支持full  join

       在mysql中不支持全外连接,但是,可以通过union 连接左外连接和右外连接,达到全外连接的效果

    (4)自连接

     思路:将一张表看做两张表  下级表   上级表

    举例:显示没有上级的员工(king)

     知识扩展:

    三表查询:

    就是先查两张表,将查出的结果看成一张表,然后跟第三张表进行联合查询,本质还是两表查询

    准备工作:先添加一张薪资等级表

    第一步:连接emp和dept表

     查询员工的编号、姓名、薪水、部门编号、部门名称

    第二步:连接第三张表

    -- 查询员工的编号、姓名、薪水、部门编号、部门名称、薪水等级

    至此,全部的表连接讲解完毕!

    欢迎留言,指出问题,有则改之无则加勉

    下面,分享所有的SQL语句:

    create table DEPT
    (
      DEPTNO int(2) not null,
      DNAME  VARCHAR(14),
      LOC    VARCHAR(13)
    );
    alter table DEPT
      add constraint PK_DEPT primary key (DEPTNO);
    create table EMP
    (
      EMPNO    int(4) primary key,
      ENAME    VARCHAR(10),
      JOB      VARCHAR(9),
      MGR      int(4),
      HIREDATE DATE,
      SAL      double(7,2),
      COMM     double(7,2),
      DEPTNO   int(2)
    );
    alter table EMP
      add constraint FK_DEPTNO foreign key (DEPTNO)
      references DEPT (DEPTNO);
    create table SALGRADE
    (
      GRADE int primary key,
      LOSAL double(7,2),
      HISAL double(7,2)
    );
    create table BONUS
    (
      ENAME VARCHAR(10),
      JOB   VARCHAR(9),
      SAL   double(7,2),
      COMM  double(7,2)
    );
    commit;
    insert into DEPT (DEPTNO, DNAME, LOC)
    values (10, 'ACCOUNTING', 'NEW YORK');
    insert into DEPT (DEPTNO, DNAME, LOC)
    values (20, 'RESEARCH', 'DALLAS');
    insert into DEPT (DEPTNO, DNAME, LOC)
    values (30, 'SALES', 'CHICAGO');
    insert into DEPT (DEPTNO, DNAME, LOC)
    values (40, 'OPERATIONS', 'BOSTON');
    commit;
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
    insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
    values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
    commit;
    insert into SALGRADE (GRADE, LOSAL, HISAL)
    values (1, 700, 1200);
    insert into SALGRADE (GRADE, LOSAL, HISAL)
    values (2, 1201, 1400);
    insert into SALGRADE (GRADE, LOSAL, HISAL)
    values (3, 1401, 2000);
    insert into SALGRADE (GRADE, LOSAL, HISAL)
    values (4, 2001, 3000);
    insert into SALGRADE (GRADE, LOSAL, HISAL)
    values (5, 3001, 9999);
    commit;
    -- 一、内连接
    -- 交叉连接 cross JOIN
    -- 笛卡尔积现象
    SELECT * 
    FROM emp
    CROSS JOIN dept;
    -- 使用using,只显示指定的同名字段
    SELECT * 
    FROM emp e
    CROSS JOIN dept d
    USING (deptno);
    -- 使用on,指定不同名的字段
    SELECT *
    FROM emp e
    CROSS JOIN dept d
    ON(e.deptno = d.deptno);
    -- natural join 自然连接 所有同名列只显示一次
    SELECT *
    FROM emp
    NATURAL JOIN dept;
    -- 二、外连接
    -- 左外连接  emp左表,dept 右表,左表全部显示,包括没有数据的列
    SELECT *
    FROM emp e -- 左表
    LEFT JOIN dept d -- 右表
    on(e.deptno = d.deptno);
    -- 右外连接  emp左表, dept右表,右表全部显示,包括没有数据的列
    SELECT * 
    FROM emp e  -- 左表
    RIGHT JOIN dept d -- 右表
    on(e.deptno = d.deptno);
    -- 全外连接 ,oracle支持,mysql不支持
    -- 可以通过关键字union进行解决,左表和右表的无对应数据列都会显示
    SELECT *
    FROM emp e
    LEFT JOIN dept d
    on(e.deptno = d.deptno);
    UNION 
    SELECT * 
    FROM emp e
    RIGHT JOIN dept d
    on(e.deptno = d.deptno);
    -- 三、三表查询
    SELECT * FROM emp;
    SELECT * FROM dept;
    SELECT * FROM salgrade;
    -- 第一步,先查两张表
    SELECT e.empno,e.ename,e.sal,d.deptno,d.dname
    FROM emp e
    JOIN dept d
    ON e.deptno = d.deptno;
    -- 第二步,连接第三张表
    SELECT e.empno, e.ename,e.sal,d.deptno,d.dname,sg.grade
    FROM emp e
    JOIN dept d
    ON e.deptno = d.deptno 
    JOIN salgrade sg
    ON e.sal BETWEEN sg.losal AND sg.hisal; 
    -- 四、自连接
    -- 不是所有表都可以进行自连接,只有表中的两列有关联关系,才可以进行自连接查询
    -- 将自身分解成两张表
    SELECT e.empno,e.ename,e.mgr,m.empno,m.ename
    FROM emp e
    LEFT JOIN emp m
    ON e.mgr = m.empno;
  • 相关阅读:
    【转】Unity学习笔记——MonoBehaviour类Invoke, Coroutine
    【转】Unity3D协同程序(Coroutine)
    Java定时任务
    SMSLib开发指南
    短信猫JAVA二次开发包SMSLib,org.smslib.TimeoutException: No response from device解决方案
    注解+反射+JDBC,实现一个简易的泛型DAO接口
    利用Window超级终端,修改短信猫波特率
    深入理解JDK动态代理机制
    深入分析Java ClassLoader原理
    Linux内核升级指南
  • 原文地址:https://www.cnblogs.com/ncl-960301-success/p/10753559.html
Copyright © 2011-2022 走看看