Oracle数据库系列之基础篇3即多表查询之多表连接基本查询

Oracle数据库多表查询之多表连接基本查询


说明:
本文依赖之前两篇文章


/*
多表查询
什么是笛卡尔积?
emp表14行,dept表4行,笛卡尔积:14*4=56行
*/

/*
Oracle的连接条件的类型
等值连接
不等值连接
外连接
自连接
*/

/*
多表连接示例
1、多表连接基本查询
使用一张以上的表做查询就是多表查询
*/

-- 查询员工表和部门表
select * from emp,dept;
/* 查询结果 */
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO DEPTNO DNAME          LOC
----- ---------- --------- ----- ----------- --------- --------- ------ ------ -------------- -------------
 7369 SMITH      CLERK      7902 1980/12/17     800.00               20     10 ACCOUNTING     NEW YORK
 7499 ALLEN      SALESMAN   7698 1981/02/20    1600.00    300.00     30     10 ACCOUNTING     NEW YORK
 7521 WARD       SALESMAN   7698 1981/02/22    1250.00    500.00     30     10 ACCOUNTING     NEW YORK
 7566 JONES      MANAGER    7839 1981/04/02    2975.00               20     10 ACCOUNTING     NEW YORK
 7654 MARTIN     SALESMAN   7698 1981/09/28    1250.00   1400.00     30     10 ACCOUNTING     NEW YORK
 7698 BLAKE      MANAGER    7839 1981/05/01    2850.00               30     10 ACCOUNTING     NEW YORK
 7782 CLARK      MANAGER    7839 1981/06/09    2450.00               10     10 ACCOUNTING     NEW YORK
 7788 SCOTT      ANALYST    7566 1987/04/19    3000.00               20     10 ACCOUNTING     NEW YORK
 7839 KING       PRESIDENT       1981/11/17    5000.00               10     10 ACCOUNTING     NEW YORK
 7844 TURNER     SALESMAN   7698 1981/09/08    1500.00      0.00     30     10 ACCOUNTING     NEW YORK
 7876 ADAMS      CLERK      7788 1987/05/23    1100.00               20     10 ACCOUNTING     NEW YORK
 7900 JAMES      CLERK      7698 1981/12/03     950.00               30     10 ACCOUNTING     NEW YORK
 7902 FORD       ANALYST    7566 1981/12/03    3000.00               20     10 ACCOUNTING     NEW YORK
 7934 MILLER     CLERK      7782 1982/01/23    1300.00               10     10 ACCOUNTING     NEW YORK
 7369 SMITH      CLERK      7902 1980/12/17     800.00               20     20 RESEARCH       DALLAS
 7499 ALLEN      SALESMAN   7698 1981/02/20    1600.00    300.00     30     20 RESEARCH       DALLAS
 7521 WARD       SALESMAN   7698 1981/02/22    1250.00    500.00     30     20 RESEARCH       DALLAS
 7566 JONES      MANAGER    7839 1981/04/02    2975.00               20     20 RESEARCH       DALLAS
 7654 MARTIN     SALESMAN   7698 1981/09/28    1250.00   1400.00     30     20 RESEARCH       DALLAS
 7698 BLAKE      MANAGER    7839 1981/05/01    2850.00               30     20 RESEARCH       DALLAS
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO DEPTNO DNAME          LOC
----- ---------- --------- ----- ----------- --------- --------- ------ ------ -------------- -------------
 7782 CLARK      MANAGER    7839 1981/06/09    2450.00               10     20 RESEARCH       DALLAS
 7788 SCOTT      ANALYST    7566 1987/04/19    3000.00               20     20 RESEARCH       DALLAS
 7839 KING       PRESIDENT       1981/11/17    5000.00               10     20 RESEARCH       DALLAS
 7844 TURNER     SALESMAN   7698 1981/09/08    1500.00      0.00     30     20 RESEARCH       DALLAS
 7876 ADAMS      CLERK      7788 1987/05/23    1100.00               20     20 RESEARCH       DALLAS
 7900 JAMES      CLERK      7698 1981/12/03     950.00               30     20 RESEARCH       DALLAS
 7902 FORD       ANALYST    7566 1981/12/03    3000.00               20     20 RESEARCH       DALLAS
 7934 MILLER     CLERK      7782 1982/01/23    1300.00               10     20 RESEARCH       DALLAS
 7369 SMITH      CLERK      7902 1980/12/17     800.00               20     30 SALES          CHICAGO
 7499 ALLEN      SALESMAN   7698 1981/02/20    1600.00    300.00     30     30 SALES          CHICAGO
 7521 WARD       SALESMAN   7698 1981/02/22    1250.00    500.00     30     30 SALES          CHICAGO
 7566 JONES      MANAGER    7839 1981/04/02    2975.00               20     30 SALES          CHICAGO
 7654 MARTIN     SALESMAN   7698 1981/09/28    1250.00   1400.00     30     30 SALES          CHICAGO
 7698 BLAKE      MANAGER    7839 1981/05/01    2850.00               30     30 SALES          CHICAGO
 7782 CLARK      MANAGER    7839 1981/06/09    2450.00               10     30 SALES          CHICAGO
 7788 SCOTT      ANALYST    7566 1987/04/19    3000.00               20     30 SALES          CHICAGO
 7839 KING       PRESIDENT       1981/11/17    5000.00               10     30 SALES          CHICAGO
 7844 TURNER     SALESMAN   7698 1981/09/08    1500.00      0.00     30     30 SALES          CHICAGO
 7876 ADAMS      CLERK      7788 1987/05/23    1100.00               20     30 SALES          CHICAGO
 7900 JAMES      CLERK      7698 1981/12/03     950.00               30     30 SALES          CHICAGO
 7902 FORD       ANALYST    7566 1981/12/03    3000.00               20     30 SALES          CHICAGO
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO DEPTNO DNAME          LOC
----- ---------- --------- ----- ----------- --------- --------- ------ ------ -------------- -------------
 7934 MILLER     CLERK      7782 1982/01/23    1300.00               10     30 SALES          CHICAGO
 7369 SMITH      CLERK      7902 1980/12/17     800.00               20     40 OPERATIONS     BOSTON
 7499 ALLEN      SALESMAN   7698 1981/02/20    1600.00    300.00     30     40 OPERATIONS     BOSTON
 7521 WARD       SALESMAN   7698 1981/02/22    1250.00    500.00     30     40 OPERATIONS     BOSTON
 7566 JONES      MANAGER    7839 1981/04/02    2975.00               20     40 OPERATIONS     BOSTON
 7654 MARTIN     SALESMAN   7698 1981/09/28    1250.00   1400.00     30     40 OPERATIONS     BOSTON
 7698 BLAKE      MANAGER    7839 1981/05/01    2850.00               30     40 OPERATIONS     BOSTON
 7782 CLARK      MANAGER    7839 1981/06/09    2450.00               10     40 OPERATIONS     BOSTON
 7788 SCOTT      ANALYST    7566 1987/04/19    3000.00               20     40 OPERATIONS     BOSTON
 7839 KING       PRESIDENT       1981/11/17    5000.00               10     40 OPERATIONS     BOSTON
 7844 TURNER     SALESMAN   7698 1981/09/08    1500.00      0.00     30     40 OPERATIONS     BOSTON
 7876 ADAMS      CLERK      7788 1987/05/23    1100.00               20     40 OPERATIONS     BOSTON
 7900 JAMES      CLERK      7698 1981/12/03     950.00               30     40 OPERATIONS     BOSTON
 7902 FORD       ANALYST    7566 1981/12/03    3000.00               20     40 OPERATIONS     BOSTON
 7934 MILLER     CLERK      7782 1982/01/23    1300.00               10     40 OPERATIONS     BOSTON
56 rows selected

/*
56条记录,emp表14条,dept表4条,56条正是emp表和dept表的记录数的乘积,称其为笛卡尔积。
如果多张表进行一起查询而且每张表的数据很大的话,笛卡尔积就会变得非常大,对其性能造成影响,
想去掉笛卡尔积,就需要我们使用关联查询。
*/

-- emp员工表
select * from emp;
/* 查询结果 */
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980/12/17     800.00               20
 7499 ALLEN      SALESMAN   7698 1981/02/20    1600.00    300.00     30
 7521 WARD       SALESMAN   7698 1981/02/22    1250.00    500.00     30
 7566 JONES      MANAGER    7839 1981/04/02    2975.00               20
 7654 MARTIN     SALESMAN   7698 1981/09/28    1250.00   1400.00     30
 7698 BLAKE      MANAGER    7839 1981/05/01    2850.00               30
 7782 CLARK      MANAGER    7839 1981/06/09    2450.00               10
 7788 SCOTT      ANALYST    7566 1987/04/19    3000.00               20
 7839 KING       PRESIDENT       1981/11/17    5000.00               10
 7844 TURNER     SALESMAN   7698 1981/09/08    1500.00      0.00     30
 7876 ADAMS      CLERK      7788 1987/05/23    1100.00               20
 7900 JAMES      CLERK      7698 1981/12/03     950.00               30
 7902 FORD       ANALYST    7566 1981/12/03    3000.00               20
 7934 MILLER     CLERK      7782 1982/01/23    1300.00               10
14 rows selected
-- dept部门表
select * from dept;
/* 查询结果 */
DEPTNO DNAME          LOC
------ -------------- -------------
    10 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON

/*
emp表和dept表都有一个共同的字段就是deptno,deptno就是两张表的关联字段,
可以使用这个字段做限制条件,两张表的关联查询字段一般是其中一张表的主键,另外一张表的外键。
*/

-- 两表关联查询
select * from emp e,dept d where e.deptno=d.deptno;
/* 查询结果 */
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO DEPTNO DNAME          LOC
----- ---------- --------- ----- ----------- --------- --------- ------ ------ -------------- -------------
 7782 CLARK      MANAGER    7839 1981/06/09    2450.00               10     10 ACCOUNTING     NEW YORK
 7839 KING       PRESIDENT       1981/11/17    5000.00               10     10 ACCOUNTING     NEW YORK
 7934 MILLER     CLERK      7782 1982/01/23    1300.00               10     10 ACCOUNTING     NEW YORK
 7566 JONES      MANAGER    7839 1981/04/02    2975.00               20     20 RESEARCH       DALLAS
 7902 FORD       ANALYST    7566 1981/12/03    3000.00               20     20 RESEARCH       DALLAS
 7876 ADAMS      CLERK      7788 1987/05/23    1100.00               20     20 RESEARCH       DALLAS
 7369 SMITH      CLERK      7902 1980/12/17     800.00               20     20 RESEARCH       DALLAS
 7788 SCOTT      ANALYST    7566 1987/04/19    3000.00               20     20 RESEARCH       DALLAS
 7521 WARD       SALESMAN   7698 1981/02/22    1250.00    500.00     30     30 SALES          CHICAGO
 7844 TURNER     SALESMAN   7698 1981/09/08    1500.00      0.00     30     30 SALES          CHICAGO
 7499 ALLEN      SALESMAN   7698 1981/02/20    1600.00    300.00     30     30 SALES          CHICAGO
 7900 JAMES      CLERK      7698 1981/12/03     950.00               30     30 SALES          CHICAGO
 7698 BLAKE      MANAGER    7839 1981/05/01    2850.00               30     30 SALES          CHICAGO
 7654 MARTIN     SALESMAN   7698 1981/09/28    1250.00   1400.00     30     30 SALES          CHICAGO
14 rows selected

/*
可以看到关联之后查询数据是14条,不再是56条
*/

-- 范例1:查询出雇员的编号、姓名,部门的编号、名称和地址
select e.empno,e.ename,d.deptno,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno;
/* 查询结果 */
EMPNO ENAME      DEPTNO DNAME          LOC
----- ---------- ------ -------------- -------------
 7782 CLARK          10 ACCOUNTING     NEW YORK
 7839 KING           10 ACCOUNTING     NEW YORK
 7934 MILLER         10 ACCOUNTING     NEW YORK
 7566 JONES          20 RESEARCH       DALLAS
 7902 FORD           20 RESEARCH       DALLAS
 7876 ADAMS          20 RESEARCH       DALLAS
 7369 SMITH          20 RESEARCH       DALLAS
 7788 SCOTT          20 RESEARCH       DALLAS
 7521 WARD           30 SALES          CHICAGO
 7844 TURNER         30 SALES          CHICAGO
 7499 ALLEN          30 SALES          CHICAGO
 7900 JAMES          30 SALES          CHICAGO
 7698 BLAKE          30 SALES          CHICAGO
 7654 MARTIN         30 SALES          CHICAGO
14 rows selected
-- 范例2:查询出每个员工的上级领导
select e1.empno,e1.ename,e2.empno,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno;
/* 查询结果 */
EMPNO ENAME      EMPNO ENAME
----- ---------- ----- ----------
 7902 FORD        7566 JONES
 7788 SCOTT       7566 JONES
 7844 TURNER      7698 BLAKE
 7499 ALLEN       7698 BLAKE
 7521 WARD        7698 BLAKE
 7900 JAMES       7698 BLAKE
 7654 MARTIN      7698 BLAKE
 7934 MILLER      7782 CLARK
 7876 ADAMS       7788 SCOTT
 7698 BLAKE       7839 KING
 7566 JONES       7839 KING
 7782 CLARK       7839 KING
 7369 SMITH       7902 FORD
13 rows selected
/*
where e1.mgr=e2.empno 这个条件值得思考
先看一下 where e1.empno=e2.empno
*/
select * from emp e1,emp e2 where e1.empno=e2.empno;

在述
/*

e1相当于员工表,e2相当于上级表;也就是说e1里面的mgr要等于e2里面的empno;
员工表里面的上级等于上级表里面的员工编号。

这就是where e1.mgr=e2.empno

*/

/* 起个别名 */
select e1.empno,e1.ename,e2.empno bossno,e2.ename bossname from emp e1,emp e2 where e1.mgr=e2.empno;
/* 查询结果 */
EMPNO ENAME      BOSSNO BOSSNAME
----- ---------- ------ ----------
 7902 FORD         7566 JONES
 7788 SCOTT        7566 JONES
 7844 TURNER       7698 BLAKE
 7499 ALLEN        7698 BLAKE
 7521 WARD         7698 BLAKE
 7900 JAMES        7698 BLAKE
 7654 MARTIN       7698 BLAKE
 7934 MILLER       7782 CLARK
 7876 ADAMS        7788 SCOTT
 7698 BLAKE        7839 KING
 7566 JONES        7839 KING
 7782 CLARK        7839 KING
 7369 SMITH        7902 FORD

/* 注意:KING是大boss,其余是他的员工 */

-- 范例3:在范例2“查询出每个员工的上级领导”的基础上,查询该员工的部门名称
select e1.empno,e1.ename,e2.empno bossno,e2.ename bossname,d.dname from emp e1,emp e2,dept d where e1.mgr=e2.empno and e1.deptno=d.deptno;
/* 查询结果 */
EMPNO ENAME      BOSSNO BOSSNAME      DNAME
----- ---------- ----- ---------- --------------
 7902 FORD        7566 JONES      RESEARCH
 7788 SCOTT       7566 JONES      RESEARCH
 7521 WARD        7698 BLAKE      SALES
 7844 TURNER      7698 BLAKE      SALES
 7654 MARTIN      7698 BLAKE      SALES
 7499 ALLEN       7698 BLAKE      SALES
 7900 JAMES       7698 BLAKE      SALES
 7934 MILLER      7782 CLARK      ACCOUNTING
 7876 ADAMS       7788 SCOTT      RESEARCH
 7698 BLAKE       7839 KING       SALES
 7566 JONES       7839 KING       RESEARCH
 7782 CLARK       7839 KING       ACCOUNTING
 7369 SMITH       7902 FORD       RESEARCH
13 rows selected
-- 查询工资表
select * from salgrade;
/* 查询结果 */
     GRADE      LOSAL      HISAL
---------- ---------- ----------
         1        700       1200
         2       1201       1400
         3       1401       2000
         4       2001       3000
         5       3001       9999
-- 范例:查询出每个员工编号、姓名、部门名称、工资等级和他的上级领导的姓名、工资等级。
select e1.empno,e1.ename,d.dname,decode(s1.grade,
                                         1,'一级',
                                         2,'二级',
                                         3,'三级',
                                         4,'四级',
                                         5,'五级') grade,
e2.empno,e2.ename,decode(s2.grade,
                                         1,'一级',
                                         2,'二级',
                                         3,'三级',
                                         4,'四级',
                                         5,'五级') grade
from emp e1,emp e2,dept d,salgrade s1, salgrade s2
where e1.mgr=e2.empno 
      and e1.deptno=d.deptno 
      and e1.sal between s1.losal and s1.hisal 
      and e2.sal between s2.losal and s2.hisal;

/* 查询结果 */
EMPNO ENAME      DNAME          GRADE EMPNO ENAME      GRADE
----- ---------- -------------- ----- ----- ---------- -----
 7566 JONES      RESEARCH       四级   7839 KING       五级
 7698 BLAKE      SALES          四级   7839 KING       五级
 7782 CLARK      ACCOUNTING     四级   7839 KING       五级
 7876 ADAMS      RESEARCH       一级   7788 SCOTT      四级
 7369 SMITH      RESEARCH       一级   7902 FORD       四级
 7788 SCOTT      RESEARCH       四级   7566 JONES      四级
 7902 FORD       RESEARCH       四级   7566 JONES      四级
 7654 MARTIN     SALES          二级   7698 BLAKE      四级
 7521 WARD       SALES          二级   7698 BLAKE      四级
 7499 ALLEN      SALES          三级   7698 BLAKE      四级
 7844 TURNER     SALES          三级   7698 BLAKE      四级
 7900 JAMES      SALES          一级   7698 BLAKE      四级
 7934 MILLER     ACCOUNTING     二级   7782 CLARK      四级
13 rows selected
-- 查询用户表
select * from user_tables;

2

/*
外连接(左右连接)
右连接
在做基本连接查询时,查询所有部门下的员工
发现部门编号为40的下面没有员工
*/

-- 部门表
select * from dept;
/* 查询结果 */
DEPTNO DNAME          LOC
------ -------------- -------------
    10 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON
-- 查询所有部门下的员工
select e.empno,e.ename,d.deptno,d.dname 
from emp e,dept d 
where e.deptno=d.deptno;
/* 查询结果 */
EMPNO ENAME      DEPTNO DNAME
----- ---------- ------ --------------
 7782 CLARK          10 ACCOUNTING
 7839 KING           10 ACCOUNTING
 7934 MILLER         10 ACCOUNTING
 7566 JONES          20 RESEARCH
 7902 FORD           20 RESEARCH
 7876 ADAMS          20 RESEARCH
 7369 SMITH          20 RESEARCH
 7788 SCOTT          20 RESEARCH
 7521 WARD           30 SALES
 7844 TURNER         30 SALES
 7499 ALLEN          30 SALES
 7900 JAMES          30 SALES
 7698 BLAKE          30 SALES
 7654 MARTIN         30 SALES
14 rows selected

/*
但是要求把所有部门下的员工都展示出来,我们发现上面的查询是办不到的
那么,这时我们要借助右连接
*/

-- 右外连接
select e.empno,e.ename,d.deptno,d.dname 
from emp e,dept d 
where e.deptno(+)=d.deptno;
/* 查询结果 */
EMPNO ENAME      DEPTNO DNAME
----- ---------- ------ --------------
 7782 CLARK          10 ACCOUNTING
 7839 KING           10 ACCOUNTING
 7934 MILLER         10 ACCOUNTING
 7566 JONES          20 RESEARCH
 7902 FORD           20 RESEARCH
 7876 ADAMS          20 RESEARCH
 7369 SMITH          20 RESEARCH
 7788 SCOTT          20 RESEARCH
 7521 WARD           30 SALES
 7844 TURNER         30 SALES
 7499 ALLEN          30 SALES
 7900 JAMES          30 SALES
 7698 BLAKE          30 SALES
 7654 MARTIN         30 SALES
                     40 OPERATIONS
15 rows selected

/*
e.deptno(+)=d.deptno,(+) 是oracle数据库中特有的表示方法
注意,(+) 表示外连接,
(+)在哪个表的后面表示哪个表会以null值去填充那些不满足连接条件却又在该表中的查询列,
此时应该以关键字(+)对面的表作为外连接的驱动表;

驱动表:
左外连接中驱动表是左边的表,右外连接中驱动表是右边的表。
*/

-- 左外连接
select d.deptno,d.dname,e.empno,e.ename 
from emp e,dept d 
where d.deptno=e.deptno(+);
/* 查询结果 */
DEPTNO DNAME          EMPNO ENAME
------ -------------- ----- ----------
    10 ACCOUNTING      7782 CLARK
    10 ACCOUNTING      7839 KING
    10 ACCOUNTING      7934 MILLER
    20 RESEARCH        7566 JONES
    20 RESEARCH        7902 FORD
    20 RESEARCH        7876 ADAMS
    20 RESEARCH        7369 SMITH
    20 RESEARCH        7788 SCOTT
    30 SALES           7521 WARD
    30 SALES           7844 TURNER
    30 SALES           7499 ALLEN
    30 SALES           7900 JAMES
    30 SALES           7698 BLAKE
    30 SALES           7654 MARTIN
    40 OPERATIONS           
15 rows selected
-- 范例:查询所有员工的上级领导
select e1.empno,e1.ename,e2.empno bossno,e2.ename bossname 
from emp e1,emp e2 
where e1.mgr=e2.empno;
/* 查询结果 */
EMPNO ENAME      BOSSNO BOSSNAME
----- ---------- ------ ----------
 7902 FORD         7566 JONES
 7788 SCOTT        7566 JONES
 7844 TURNER       7698 BLAKE
 7499 ALLEN        7698 BLAKE
 7521 WARD         7698 BLAKE
 7900 JAMES        7698 BLAKE
 7654 MARTIN       7698 BLAKE
 7934 MILLER       7782 CLARK
 7876 ADAMS        7788 SCOTT
 7698 BLAKE        7839 KING
 7566 JONES        7839 KING
 7782 CLARK        7839 KING
 7369 SMITH        7902 FORD
13 rows selected

/*
分析:
通过查询结果发现KING的上级领导没有展示出来,所以这时我们要借助外连接把他查询出来
*/

-- 左外连接
select e1.empno,e1.ename,e2.empno bossno,e2.ename bossname 
from emp e1,emp e2 
where e1.mgr=e2.empno(+);

/* 查询结果 */
SQL> 
EMPNO ENAME      BOSSNO BOSSNAME
----- ---------- ------ ----------
 7902 FORD         7566 JONES
 7788 SCOTT        7566 JONES
 7900 JAMES        7698 BLAKE
 7844 TURNER       7698 BLAKE
 7654 MARTIN       7698 BLAKE
 7521 WARD         7698 BLAKE
 7499 ALLEN        7698 BLAKE
 7934 MILLER       7782 CLARK
 7876 ADAMS        7788 SCOTT
 7782 CLARK        7839 KING
 7698 BLAKE        7839 KING
 7566 JONES        7839 KING
 7369 SMITH        7902 FORD
 7839 KING              
14 rows selected

/*
为什么要使用左连接?
因为,左边员工表里面有KING,右边boss表里面没有KING的上级,现在要连接查询,所以用左外连接
*/

/*
下面我们来看一下,查询每个员工的下级
*/

-- 使用左外连接
select e1.empno,e1.ename,e2.empno 下级no,e2.ename 下级name 
from emp e1,emp e2 
where e1.empno=e2.mgr(+);
/* 查询结果 */
EMPNO ENAME        下级NO 下级NAME
----- ---------- ------ ----------
 7369 SMITH             
 7499 ALLEN             
 7521 WARD              
 7566 JONES        7902 FORD
 7566 JONES        7788 SCOTT
 7654 MARTIN            
 7698 BLAKE        7844 TURNER
 7698 BLAKE        7499 ALLEN
 7698 BLAKE        7521 WARD
 7698 BLAKE        7900 JAMES
 7698 BLAKE        7654 MARTIN
 7782 CLARK        7934 MILLER
 7788 SCOTT        7876 ADAMS
 7839 KING         7698 BLAKE
 7839 KING         7566 JONES
 7839 KING         7782 CLARK
 7844 TURNER            
 7876 ADAMS             
 7900 JAMES             
 7902 FORD         7369 SMITH
EMPNO ENAME        下级NO 下级NAME
----- ---------- ------ ----------
 7934 MILLER            
21 rows selected

/*
下面使用 left/right (outer) join on 语法
左连接语法:
目标表1 left (outer) join 目标表2 on (连接条件)
右连接语法:
目标表1 right (outer) join 目标表2 on (连接条件)
*/

-- 查询各个员工的上级
-- 左外连接
select e1.empno,e1.ename,e2.empno bossno,e2.ename bossname 
from emp e1 left outer join emp e2 on (e1.mgr=e2.empno);
/* 查询结果 */
EMPNO ENAME      BOSSNO BOSSNAME
----- ---------- ------ ----------
 7902 FORD         7566 JONES
 7788 SCOTT        7566 JONES
 7900 JAMES        7698 BLAKE
 7844 TURNER       7698 BLAKE
 7654 MARTIN       7698 BLAKE
 7521 WARD         7698 BLAKE
 7499 ALLEN        7698 BLAKE
 7934 MILLER       7782 CLARK
 7876 ADAMS        7788 SCOTT
 7782 CLARK        7839 KING
 7698 BLAKE        7839 KING
 7566 JONES        7839 KING
 7369 SMITH        7902 FORD
 7839 KING              
14 rows selected
-- 右外连接
select e1.empno,e1.ename,e2.empno bossname,e2.ename bossname
from emp e2 right outer join emp e1 on (e1.mgr=e2.empno);
/* 查询结果 */
EMPNO ENAME      BOSSNAME BOSSNAME
----- ---------- -------- ----------
 7902 FORD           7566 JONES
 7788 SCOTT          7566 JONES
 7900 JAMES          7698 BLAKE
 7844 TURNER         7698 BLAKE
 7654 MARTIN         7698 BLAKE
 7521 WARD           7698 BLAKE
 7499 ALLEN          7698 BLAKE
 7934 MILLER         7782 CLARK
 7876 ADAMS          7788 SCOTT
 7782 CLARK          7839 KING
 7698 BLAKE          7839 KING
 7566 JONES          7839 KING
 7369 SMITH          7902 FORD
 7839 KING                
14 rows selected
-- 查询每个员工的下级
-- 左外连接
select e1.empno,e1.ename,e2.empno,e2.ename 
from emp e1 left outer join emp e2 on (e1.empno=e2.mgr);
/* 查询结果 */
EMPNO ENAME      EMPNO ENAME
----- ---------- ----- ----------
 7369 SMITH            
 7499 ALLEN            
 7521 WARD             
 7566 JONES       7902 FORD
 7566 JONES       7788 SCOTT
 7654 MARTIN           
 7698 BLAKE       7844 TURNER
 7698 BLAKE       7499 ALLEN
 7698 BLAKE       7521 WARD
 7698 BLAKE       7900 JAMES
 7698 BLAKE       7654 MARTIN
 7782 CLARK       7934 MILLER
 7788 SCOTT       7876 ADAMS
 7839 KING        7698 BLAKE
 7839 KING        7566 JONES
 7839 KING        7782 CLARK
 7844 TURNER           
 7876 ADAMS            
 7900 JAMES            
 7902 FORD        7369 SMITH
EMPNO ENAME      EMPNO ENAME
----- ---------- ----- ----------
 7934 MILLER           
21 rows selected
-- 右外连接
select e1.empno,e1.ename,e2.empno lowno,e2.ename lowname
from emp e2 right join emp e1 on (e2.mgr=e1.empno);
/* 查询结果 */
EMPNO ENAME      LOWNO LOWNAME
----- ---------- ----- ----------
 7369 SMITH            
 7499 ALLEN            
 7521 WARD             
 7566 JONES       7902 FORD
 7566 JONES       7788 SCOTT
 7654 MARTIN           
 7698 BLAKE       7844 TURNER
 7698 BLAKE       7499 ALLEN
 7698 BLAKE       7521 WARD
 7698 BLAKE       7900 JAMES
 7698 BLAKE       7654 MARTIN
 7782 CLARK       7934 MILLER
 7788 SCOTT       7876 ADAMS
 7839 KING        7698 BLAKE
 7839 KING        7566 JONES
 7839 KING        7782 CLARK
 7844 TURNER           
 7876 ADAMS            
 7900 JAMES            
 7902 FORD        7369 SMITH
EMPNO ENAME      LOWNO LOWNAME
----- ---------- ----- ----------
 7934 MILLER           
21 rows selected

都看到最后了啦,如果觉得写得好的话呐
记得 一键三连 哦!点赞 也行呐!

注意
原创不易,本文可白嫖、可转载;
但请不要“臭不要脸”的CV本文到自己原创!!!
如有发现,必究之!


更多精彩,敬请关注!
博客: 闭关苦练内功
微信公众号:码农coding
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/frdevolcqzyxynjds/article/details/109308505