Oracle 多表连接

时光总嘲笑我的痴心妄想 提交于 2019-12-22 18:25:52

两个表的笛卡尔积运算

这种运算没有意义可言。

    DEPTNO DNAME          LOC           ENAME             SAL
---------- -------------- ------------- ---------- ----------
        40 OPERATIONS     BOSTON        FORD             3000
        40 OPERATIONS     BOSTON        MILLER           2900

已选择52行。

自然连接(自动查找连接条件)

SQL> select * from emp  natural join dept;

    DEPTNO      EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM DNAME       LOC
---------- ---------- ---------- --------- ---------- -------------- ---------- ---------- -------------- -------------
        30       7499 ALLEN      SALESMAN        7698 20-2-81         1604.5        300 SALES          CHICAGO
        30       7521 WARD       SALESMAN        7698 22-2-81           3000        500 SALES          CHICAGO
        20       7566 JONES      MANAGER         7839 02-4-81           2975            RESEARCH       DALLAS
        30       7654 MARTIN     SALESMAN        7698 28-9-81           3000       1400 SALES          CHICAGO
        30       7698 BLAKE      MANAGER         7839 01-5-81           3050            SALES          CHICAGO
        10       7782 CLARK      MANAGER         7839 09-6-81           3050            ACCOUNTING     NEW YORK
        20       7788 SCOTT      ANALYST         7566 19-4-87           3000            RESEARCH       DALLAS
        10       7839 KING       PRESIDENT            17-11-81           5000            ACCOUNTING     NEW YORK
        30       7844 TURNER     SALESMAN        7698 08-9-81           2960          0 SALES          CHICAGO
        20       7876 ADAMS      CLERK           7788 23-5-87           2700            RESEARCH       DALLAS

    DEPTNO      EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM DNAME       LOC
---------- ---------- ---------- --------- ---------- -------------- ---------- ---------- -------------- -------------
        30       7900 JAMES      CLERK           7698 03-12-81           2550            SALES          CHICAGO
        20       7902 FORD       ANALYST         7566 03-12-81           3000            RESEARCH       DALLAS
        10       7934 MILLER     CLERK           7782 23-1-82           2900            ACCOUNTING     NEW YORK

已选择13行。

自连接

SQL> select eshang.ename 上司,exia.ename 下属 from emp eshang,emp exia where eshang.empno=exia.mgr;

上司       下属
---------- ----------
JONES      SCOTT
JONES      FORD
BLAKE      MARTIN

join字段连接

(1)内连接:[inner] join
select empno,ename,emp.deptno,dname from emp inner join dept on emp.deptno=dept.deptno;(等价于简单连接查询)

(2)外连接:[outer] join
左外连接:左表 left [outer] join 右表
select empno,ename,dept.deptno,dname from emp left join dept on emp.deptno=dept.deptno;
右外连接: 左表 right [outer] join 右表
select empno,ename,dept.deptno,dname from emp right join dept on emp.deptno=dept.deptno;
完全外连接:左表 full [outer] join 右表
select empno,ename,dept.deptno,dname from emp full join dept on emp.deptno=dept.deptno;

集合运算(交并差)

SQL> select empno,ename,job,sal from emp where sal>2000 union select empno,ename,job,sal from emp where job='MANAGER';

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7521 WARD       SALESMAN        3000
      7566 JONES      MANAGER         2975
      7654 MARTIN     SALESMAN        3000
      7698 BLAKE      MANAGER         3050
      7782 CLARK      MANAGER         3050
      7788 SCOTT      ANALYST         3000
      7839 KING       PRESIDENT       5000
      7844 TURNER     SALESMAN        2960
      7876 ADAMS      CLERK           2700
      7900 JAMES      CLERK           2550

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7902 FORD       ANALYST         3000
      7934 MILLER     CLERK           2900

已选择12行。

SQL> select empno,ename,job,sal from emp where sal>2000 intersect select empno,ename,job,sal from emp where job='MANAGER';

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7566 JONES      MANAGER         2975
      7698 BLAKE      MANAGER         3050
      7782 CLARK      MANAGER         3050

SQL> select empno,ename,job,sal from emp where sal>2000 minus select empno,ename,job,sal from emp where job='MANAGER';

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7521 WARD       SALESMAN        3000
      7654 MARTIN     SALESMAN        3000
      7788 SCOTT      ANALYST         3000
      7839 KING       PRESIDENT       5000
      7844 TURNER     SALESMAN        2960
      7876 ADAMS      CLERK           2700
      7900 JAMES      CLERK           2550
      7902 FORD       ANALYST         3000
      7934 MILLER     CLERK           2900

已选择9行。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!