开发笔记_Oracle学习笔记 _06_连接

Oracle学习 第六天

           ——  Oracle中数据表的连接


自连接

            自连接  顾名思义就是数据表与自身之间的连接。
            依然以EMP表为例。
            可以看出 EMP 表中,EMPNO 字段 与 MGR 字段实际上都是员工的编号,只不过在同一行中产生了对应关系。
            此时,如果想要查询每个 员工 与其对应的 MGR 的详细信息。即EMP表与自身之间的联系。这时使用到的就是自连接。

            示例:查询EMP表中员工编号、员工姓名、员工工作、员工对应的MGR的编号、姓名、工作信息

SELECT E.EMPNO 员工编号, E.ENAME 员工姓名, E.JOB 员工工作, M.EMPNO 经理编号, M.ENAME 经理姓名, M.JOB 经理工作 FROM EMP E, EMP M WHERE E.MGR = M.EMPNO;

内连接

            内连接  即对  两张表的笛卡尔积  进行条件筛选。
            示例:查询员工的信息与员工对应的部门的详细信息、

SELECT * FROM EMP E INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
等价于     SELECT * FROM EMP E JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
等价于   SELECT * FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;

外连接

             外连接  即在条件筛选后得到的内连接数据基础上,还包括了其中一张表或者两张表中 不满足条件的数据。具体分以下三种情况。
             外连接的示例效果在两张表的关联字段没有全部对应的时候体现比较明显。这里我们就不再建表。我们采用自连接的示例来演示外连接。
               不知有没有人发现,自连接中 员工与经理 之间的对应关系表中,总共14个员工,却只产生了13组对应关系。原因是有一个最大的 “Boss"  King 先生,并没有对应的经理。所以也就没有显示出来。
                但是,如果我们想让他显示出来在上下级对应关系表的员工列中,只是其对应的 上级 MGR 显示为空呢?
               又或者说,有很多员工没有 MGR 身份,换言之,没有下属,但我们想让这些员工也显示在上下级对应关系表的MGR列中,只是其对应的下级 员工 为空呢?
            

            1、左外连接 -- LEFT JOIN

                    LEFT JOIN 关键字左侧的表完全显示


SELECT E.EMPNO 员工编号, E.ENAME 员工姓名, E.JOB 员工工作, M.EMPNO 经理编号, M.ENAME 经理姓名, M.JOB 经理工作 FROM EMP E LEFT JOIN EMP M ON E.MGR = M.EMPNO;

等价于

SELECT E.EMPNO 员工编号, E.ENAME 员工姓名, E.JOB 员工工作, M.EMPNO 经理编号, M.ENAME 经理姓名, M.JOB 经理工作 FROM EMP E, EMP M WHERE E.MGR = M.EMPNO(+);


★ 注意:(+)号 代表   等号对方的表   就是需要保留的表

            2、右外连接  -- RIGHT JOIN

                    RIGHT JOIN 关键字右侧的表完全显示

SELECT E.EMPNO 员工编号, E.ENAME 员工姓名, E.JOB 员工工作, M.EMPNO 经理编号, M.ENAME 经理姓名, M.JOB 经理工作 FROM EMP E RIGHT JOIN EMP M ON E.MGR = M.EMPNO;

等价于

SELECT E.EMPNO 员工编号, E.ENAME 员工姓名, E.JOB 员工工作, M.EMPNO 经理编号, M.ENAME 经理姓名, M.JOB 经理工作 FROM EMP E, EMP M WHERE E.MGR(+) = M.EMPNO;

★ 注意:可以发现,实际上左右外联是可以相互转换的。只需要将 LEFT JOIN 或者 RIGHT JOIN 关键字变更的同时 表的左右位置也变化,最终的得到的结果是完全一样的。

SELECT E.EMPNO 员工编号, E.ENAME 员工姓名, E.JOB 员工工作, M.EMPNO 经理编号, M.ENAME 经理姓名, M.JOB 经理工作 FROM EMP E RIGHT JOIN EMP M ON E.MGR = M.EMPNO;

等价于

SELECT E.EMPNO 员工编号, E.ENAME 员工姓名, E.JOB 员工工作, M.EMPNO 经理编号, M.ENAME 经理姓名, M.JOB 经理工作 FROM EMP M LEFT JOIN EMP E ON E.MGR = M.EMPNO;

            3、完全外连接  -- FULL OUTER JOIN

                    两张表都完全显示。

SELECT E.EMPNO 员工编号, E.ENAME 员工姓名, E.JOB 员工工作, M.EMPNO 经理编号, M.ENAME 经理姓名, M.JOB 经理工作 FROM EMP E FULL OUTER JOIN EMP M ON E.MGR = M.EMPNO;

猜你喜欢

转载自blog.csdn.net/shaotaiban1097/article/details/80385445