经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Oracle » 查看文章
清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
来源:cnblogs  作者:小菜鸟大梦想  时间:2019/4/23 8:43:34  对本文有异议

直入主题:

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

使用内连接,查询数据

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

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

(1)左外连接:left join

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

(2)右外连接:right join

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

(3)全外连接

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

注意:在oracle中支持full  join

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

(4)自连接

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

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

 

 知识扩展:

三表查询:

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

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

第一步:连接emp和dept表

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

第二步:连接第三张表

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

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

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

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

  1. create table DEPT
  2. (
  3. DEPTNO int(2) not null,
  4. DNAME VARCHAR(14),
  5. LOC VARCHAR(13)
  6. );
  7. alter table DEPT
  8. add constraint PK_DEPT primary key (DEPTNO);
  9. create table EMP
  10. (
  11. EMPNO int(4) primary key,
  12. ENAME VARCHAR(10),
  13. JOB VARCHAR(9),
  14. MGR int(4),
  15. HIREDATE DATE,
  16. SAL double(7,2),
  17. COMM double(7,2),
  18. DEPTNO int(2)
  19. );
  20. alter table EMP
  21. add constraint FK_DEPTNO foreign key (DEPTNO)
  22. references DEPT (DEPTNO);
  23. create table SALGRADE
  24. (
  25. GRADE int primary key,
  26. LOSAL double(7,2),
  27. HISAL double(7,2)
  28. );
  29. create table BONUS
  30. (
  31. ENAME VARCHAR(10),
  32. JOB VARCHAR(9),
  33. SAL double(7,2),
  34. COMM double(7,2)
  35. );
  36. commit;
  37. insert into DEPT (DEPTNO, DNAME, LOC)
  38. values (10, 'ACCOUNTING', 'NEW YORK');
  39. insert into DEPT (DEPTNO, DNAME, LOC)
  40. values (20, 'RESEARCH', 'DALLAS');
  41. insert into DEPT (DEPTNO, DNAME, LOC)
  42. values (30, 'SALES', 'CHICAGO');
  43. insert into DEPT (DEPTNO, DNAME, LOC)
  44. values (40, 'OPERATIONS', 'BOSTON');
  45. commit;
  46. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  47. values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
  48. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  49. values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
  50. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  51. values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
  52. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  53. values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
  54. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  55. values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
  56. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  57. values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
  58. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  59. values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
  60. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  61. values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);
  62. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  63. values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
  64. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  65. values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
  66. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  67. values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);
  68. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  69. values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
  70. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  71. values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
  72. insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  73. values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
  74. commit;
  75. insert into SALGRADE (GRADE, LOSAL, HISAL)
  76. values (1, 700, 1200);
  77. insert into SALGRADE (GRADE, LOSAL, HISAL)
  78. values (2, 1201, 1400);
  79. insert into SALGRADE (GRADE, LOSAL, HISAL)
  80. values (3, 1401, 2000);
  81. insert into SALGRADE (GRADE, LOSAL, HISAL)
  82. values (4, 2001, 3000);
  83. insert into SALGRADE (GRADE, LOSAL, HISAL)
  84. values (5, 3001, 9999);
  85. commit;
  1. -- 一、内连接
  2. -- 交叉连接 cross JOIN
  3. -- 笛卡尔积现象
  4. SELECT *
  5. FROM emp
  6. CROSS JOIN dept;
  7. -- 使用using,只显示指定的同名字段
  8. SELECT *
  9. FROM emp e
  10. CROSS JOIN dept d
  11. USING (deptno);
  12. -- 使用on,指定不同名的字段
  13. SELECT *
  14. FROM emp e
  15. CROSS JOIN dept d
  16. ON(e.deptno = d.deptno);
  17. -- natural join 自然连接 所有同名列只显示一次
  18. SELECT *
  19. FROM emp
  20. NATURAL JOIN dept;
  21. -- 二、外连接
  22. -- 左外连接 emp左表,dept 右表,左表全部显示,包括没有数据的列
  23. SELECT *
  24. FROM emp e -- 左表
  25. LEFT JOIN dept d -- 右表
  26. on(e.deptno = d.deptno);
  27. -- 右外连接 emp左表, dept右表,右表全部显示,包括没有数据的列
  28. SELECT *
  29. FROM emp e -- 左表
  30. RIGHT JOIN dept d -- 右表
  31. on(e.deptno = d.deptno);
  32. -- 全外连接 oracle支持,mysql不支持
  33. -- 可以通过关键字union进行解决,左表和右表的无对应数据列都会显示
  34. SELECT *
  35. FROM emp e
  36. LEFT JOIN dept d
  37. on(e.deptno = d.deptno);
  38. UNION
  39. SELECT *
  40. FROM emp e
  41. RIGHT JOIN dept d
  42. on(e.deptno = d.deptno);
  43. -- 三、三表查询
  44. SELECT * FROM emp;
  45. SELECT * FROM dept;
  46. SELECT * FROM salgrade;
  47. -- 第一步,先查两张表
  48. SELECT e.empno,e.ename,e.sal,d.deptno,d.dname
  49. FROM emp e
  50. JOIN dept d
  51. ON e.deptno = d.deptno;
  52. -- 第二步,连接第三张表
  53. SELECT e.empno, e.ename,e.sal,d.deptno,d.dname,sg.grade
  54. FROM emp e
  55. JOIN dept d
  56. ON e.deptno = d.deptno
  57. JOIN salgrade sg
  58. ON e.sal BETWEEN sg.losal AND sg.hisal;
  59. -- 四、自连接
  60. -- 不是所有表都可以进行自连接,只有表中的两列有关联关系,才可以进行自连接查询
  61. -- 将自身分解成两张表
  62. SELECT e.empno,e.ename,e.mgr,m.empno,m.ename
  63. FROM emp e
  64. LEFT JOIN emp m
  65. ON e.mgr = m.empno;

 

原文链接:http://www.cnblogs.com/ncl-960301-success/p/10753559.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号