2011年7月21日木曜日

[基础知识] join时on和where的区别

- inner join 时的on与where一样,把限制条件放在哪里都一样
- on是结合时的条件,以什么样的条件来结合,或者说什么样的数据才可以结合
- where是筛选条件,满足什么条件的数据才可以查询出来
- on筛选时Null值可以查询出来,而where则会去掉null值,所以两者得到的结果集不总是一样的

- inner join
-- inner join 时的on
scott@XE> select * from emp e inner join dept d on (e.ename='ALLEN' and e.deptno=d.deptno);
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO     DEPTNO DNAME  
---------- ---------- --------- ---------- -------- ---------- ---------- ---------- ---------- --------------
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30         30 SALES      

1 row selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 351108634

----------------------------------------------------------------------------------------
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |         |     1 |   117 |     3   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                |         |     1 |   117 |     3   (0)| 00:00:01 |
|*  2 |   TABLE ACCESS FULL          | EMP     |     1 |    87 |     2   (0)| 00:00:01 |
|   3 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    30 |     1   (0)| 00:00:01 |
|*  4 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("E"."ENAME"='ALLEN')
   4 - access("E"."DEPTNO"="D"."DEPTNO")

-- inner join 时的where
select * from emp e inner join dept d on (e.deptno=d.deptno) where e.ename='ALLEN';
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO     DEPTNO DNAME   
---------- ---------- --------- ---------- -------- ---------- ---------- ---------- ---------- --------------
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30         30 SALES       

1 row selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 351108634

----------------------------------------------------------------------------------------
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |         |     1 |   117 |     3   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                |         |     1 |   117 |     3   (0)| 00:00:01 |
|*  2 |   TABLE ACCESS FULL          | EMP     |     1 |    87 |     2   (0)| 00:00:01 |
|   3 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    30 |     1   (0)| 00:00:01 |
|*  4 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("E"."ENAME"='ALLEN')
   4 - access("E"."DEPTNO"="D"."DEPTNO")

- left join/right join
-- 两表通过deptno的结合结果,emp表数据全部被查询出来
scott@XE> select * from emp e left join dept d on (e.deptno=d.deptno);
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO     DEPTNO DNAME 
---------- ---------- --------- ---------- -------- ---------- ---------- ---------- ---------- --------------
      7934 MILLER     CLERK           7782 82-01-23       1300                    10         10 ACCOUNTING
      7839 KING       PRESIDENT            81-11-17       5000                    10         10 ACCOUNTING
      7782 CLARK      MANAGER         7839 81-06-09       2450                    10         10 ACCOUNTING
      7902 FORD       ANALYST         7566 81-12-03       3000                    20         20 RESEARCH  
      7876 ADAMS      CLERK           7788 87-05-23       1100                    20         20 RESEARCH  
      7788 SCOTT      ANALYST         7566 87-04-19       3000                    20         20 RESEARCH 
      7566 JONES      MANAGER         7839 81-04-02       2975                    20         20 RESEARCH 
      7369 SMITH      CLERK           7902 80-12-17        800                    20         20 RESEARCH  
      7900 JAMES      CLERK           7698 81-12-03        950                    30         30 SALES     
      7844 TURNER     SALESMAN        7698 81-09-08       1500          0         30         30 SALES     
      7698 BLAKE      MANAGER         7839 81-05-01       2850                    30         30 SALES     
      7654 MARTIN     SALESMAN        7698 81-09-28       1250       1400         30         30 SALES     
      7521 WARD       SALESMAN        7698 81-02-22       1250        500         30         30 SALES     
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30         30 SALES     

14 rows selected.

-- on是结合时的筛选条件,不符合d.dname='SALES'的记录以null填充
scott@XE> select * from emp e left join dept d on (e.deptno=d.deptno and d.dname='SALES');
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO     DEPTNO DNAME 
---------- ---------- --------- ---------- -------- ---------- ---------- ---------- ---------- --------------
      7900 JAMES      CLERK           7698 81-12-03        950                    30         30 SALES     
      7844 TURNER     SALESMAN        7698 81-09-08       1500          0         30         30 SALES     
      7698 BLAKE      MANAGER         7839 81-05-01       2850                    30         30 SALES     
      7654 MARTIN     SALESMAN        7698 81-09-28       1250       1400         30         30 SALES     
      7521 WARD       SALESMAN        7698 81-02-22       1250        500         30         30 SALES     
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30         30 SALES     
      7934 MILLER     CLERK           7782 82-01-23       1300                    10
      7839 KING       PRESIDENT            81-11-17       5000                    10
      7782 CLARK      MANAGER         7839 81-06-09       2450                    10
      7902 FORD       ANALYST         7566 81-12-03       3000                    20
      7876 ADAMS      CLERK           7788 87-05-23       1100                    20
      7788 SCOTT      ANALYST         7566 87-04-19       3000                    20
      7566 JONES      MANAGER         7839 81-04-02       2975                    20
      7369 SMITH      CLERK           7902 80-12-17        800                    20

14 rows selected.

-- on是结合时的筛选条件,不符合e.ename='ALLEN'的记录以null填充
scott@XE> select * from emp e left join dept d on (e.deptno=d.deptno and e.ename='ALLEN');
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO     DEPTNO DNAME 
---------- ---------- --------- ---------- -------- ---------- ---------- ---------- ---------- --------------
      7369 SMITH      CLERK           7902 80-12-17        800                    20
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30         30 SALES     
      7521 WARD       SALESMAN        7698 81-02-22       1250        500         30
      7566 JONES      MANAGER         7839 81-04-02       2975                    20
      7654 MARTIN     SALESMAN        7698 81-09-28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81-05-01       2850                    30
      7782 CLARK      MANAGER         7839 81-06-09       2450                    10
      7788 SCOTT      ANALYST         7566 87-04-19       3000                    20
      7839 KING       PRESIDENT            81-11-17       5000                    10
      7844 TURNER     SALESMAN        7698 81-09-08       1500          0         30
      7876 ADAMS      CLERK           7788 87-05-23       1100                    20
      7900 JAMES      CLERK           7698 81-12-03        950                    30
      7902 FORD       ANALYST         7566 81-12-03       3000                    20
      7934 MILLER     CLERK           7782 82-01-23       1300                    10

14 rows selected.

-- where是结合后的筛选条件,不符合d.dname='SALES'的记录被去掉
scott@XE> select * from emp e left join dept d on (e.deptno=d.deptno) where d.dname='SALES';
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO     DEPTNO DNAME 
---------- ---------- --------- ---------- -------- ---------- ---------- ---------- ---------- --------------
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30         30 SALES     
      7521 WARD       SALESMAN        7698 81-02-22       1250        500         30         30 SALES     
      7654 MARTIN     SALESMAN        7698 81-09-28       1250       1400         30         30 SALES    
      7698 BLAKE      MANAGER         7839 81-05-01       2850                    30         30 SALES     
      7844 TURNER     SALESMAN        7698 81-09-08       1500          0         30         30 SALES    
      7900 JAMES      CLERK           7698 81-12-03        950                    30         30 SALES     

6 rows selected.

-- where是结合后的筛选条件,不符合e.ename='ALLEN'的记录被去掉
scott@XE> select * from emp e left join dept d on (e.deptno=d.deptno) where e.ename='ALLEN';
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO     DEPTNO DNAME  
---------- ---------- --------- ---------- -------- ---------- ---------- ---------- ---------- --------------
      7499 ALLEN      SALESMAN        7698 81-02-20       1600        300         30         30 SALES      

1 row selected.

0 件のコメント:

コメントを投稿