等值连接:
等值连接是连接查询中最常见的一种,通常是在有主外建关联关系的表间建立,并将连接条件设定为有关系的列,使用等号“=”连接相关的表。
也可以此类推,对多个表做等值连接查询,多个表之间存在主从表关系,连接,连接条件同样写在where子句中。为了避免笛卡尔积,连接n个表,最少需要n-1个连接条件。
主从表关系的简单解释:在有主外键关联关系的表中,被参考的表称作主表,参考别表的表称为从表。以EMP和DEPT表为例,EMP的所在部门参考DEPT表的部门编码,DEPT表被称作主表,EMP表被作从表。主从表的概念是相对的,在一组表关系中的表,在另一组关系中可能是从表。
自连接:
自连接是一种比较特殊的连接查询,数据的来源是一个表,即关联关系来自于单表中的多个列。表中的列参照同一个表中的其他列的情况自参照表,比如职员表中经理列,就参照本表中编码列,即经理也是机构下的职员之一。
自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接,下面查出每个职员的经理名字,以及他们的职员编码。
SQL> select worker.empno w_empno,worker.ename w_ename,manager.empno m_empno,
2 manager.ename m_ename
3 from emp worker, emp manager
4 where worker.mgr=manager.empno;
W_EMPNO W_ENAME M_EMPNO M_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
W_EMPNO W_ENAME M_EMPNO M_ENAME
---------- ---------- ---------- ----------
7782 CLARK 7839 KING
7369 SMITH 7902 FORD
已选择13行。
又一大分类,以上所介绍的连接查询都属于内连接,即返回满足连接条件的数据记录。
在有些情况下需要返回那些不满足连接条件的记录,比如有些员工还没有分配部门,或者有新成立的部门还没有所属员工,这些情况都无法使用内连接得到查询结果。
此时需要使用外连接,即不仅返回满足连接条件的记录,还将返回不满足投机条件的记录。在Oracle 9i之前,外连接在where条件中指定,9i版本之后则一般在from短语中指定。
Oracle 9i后连接语法:
select table1.column,table2.column
from table1 [INNER | LEFT | RIGEHT | FULL ] JOIN table2
on table1.column1=table2.column2;
其中,INNER表示内连接,LEFT JOIN、RIGHT JOIN 、FULL JOIN 分别表示左外连接、右外连接、全外连接、ON短语表示连接条件。
1.内连接
内连接返回所有满足连接条件的记录。比如查询职员表和部门表,获得职员的名字和部门名字。内连接的方式有几种。
第1种是上面介绍的等值连接这种形式,在Oracle不同的版本下通用,如下例所示。
SQL> spool off
SQL> select e.ename,d.dname
2 from emp e,dept d
3 where e.deptno=d.deptno;
ENAME DNAME
---------- --------------
CLARK ACCOUNTING
KING ACCOUNTING
MILLER ACCOUNTING
JONES RESEARCH
FORD RESEARCH
ADAMS RESEARCH
SMITH RESEARCH
SCOTT RESEARCH
WARD SALES
TURNER SALES
ALLEN SALES
ENAME DNAME
---------- --------------
JAMES SALES
BLAKE SALES
MARTIN SALES
已选择14行。
第2种方式是使用NALTURAL JOIN短语,将两个表中所有同名列做等值连接。naltural join
如果表中的同名列数据类型不同不能比较的话,将会报错。注意这种方式以后的几种都只能在Oracle 9i版本以后使用。
SQL> select e.ename,d.dname
2 from emp e NATURAL JOIN dept d;
ENAME DNAME
---------- --------------
CLARK ACCOUNTING
KING ACCOUNTING
MILLER ACCOUNTING
JONES RESEARCH
FORD RESEARCH
ADAMS RESEARCH
SMITH RESEARCH
SCOTT RESEARCH
WARD SALES
TURNER SALES
ALLEN SALES
ENAME DNAME
---------- --------------
JAMES SALES
BLAKE SALES
MARTIN SALES
已选择14行。
第3种是使用USING子句实现,较NATURAL JOIN方式更加灵活,是将两个表中指定的同名列做等值连接,避免了同名列可能因类型不同导致的错误。
SQL> select e.ename,d.dname
2 from emp e join dept d
3 using(deptno);
ENAME DNAME
---------- --------------
CLARK ACCOUNTING
KING ACCOUNTING
MILLER ACCOUNTING
JONES RESEARCH
FORD RESEARCH
ADAMS RESEARCH
SMITH RESEARCH
SCOTT RESEARCH
WARD SALES
TURNER SALES
ALLEN SALES
ENAME DNAME
---------- --------------
JAMES SALES
BLAKE SALES
MARTIN SALES
已选择14行。
第4种方式使用ON子句。这种方式避免了第3种方式中必须有同名列的缺陷,可以在ON子句中指定连接条件,列名可以相同也可以不同。
SQL> select e.ename,d.dname
2 from emp e join dept d
3 on(e.deptno=d.deptno);
ENAME DNAME
---------- --------------
CLARK ACCOUNTING
KING ACCOUNTING
MILLER ACCOUNTING
JONES RESEARCH
FORD RESEARCH
ADAMS RESEARCH
SMITH RESEARCH
SCOTT RESEARCH
WARD SALES
TURNER SALES
ALLEN SALES
ENAME DNAME
---------- --------------
JAMES SALES
BLAKE SALES
MARTIN SALES
已选择14行。
2.介绍完内连接,就应该说说外连接了,从上面已经知道了外连接包括左外连接,右外连接,全外连接。
2.1.左外连接:
外连接是内连接的一种扩展,左外连接是指不仅会返回满足连接条件的记录,还可以返回那些不满足连接的操作符左边表的其他记录。
为了做测试,需要先向数据表中插入一条员工记录,这名员工只有编码和姓名,尚未分配部门,以造成一种不满足等值连接条件的情况。
外连接的测试的准备工作:
SQL> insert into emp(empno,ename)
2 values(1235,'MATHA');
已创建 1 行。
如果做等值连接,刚刚入职的职员matha是不会被列的。为了要列出这名员工,使用下面的左外连接的方式。
SQL> select e.ename,d.dname
2 from emp e LEFT OUTER JOIN dept d
3 on e.deptno=d.deptno;
ENAME DNAME
---------- --------------
MILLER ACCOUNTING
KING ACCOUNTING
CLARK ACCOUNTING
FORD RESEARCH
ADAMS RESEARCH
SCOTT RESEARCH
JONES RESEARCH
SMITH RESEARCH
JAMES SALES
TURNER SALES
BLAKE SALES
ENAME DNAME
---------- --------------
MARTIN SALES
WARD SALES
ALLEN SALES
MATHA
已选择15行。
在Oracle 9i之前,上述左外连接还可以写成下面这种方式,(+)放在返回行数较少的表一边,换句话,以等号为界,(+)号对面的表中所有不符合等会连接条件的记录被列出。
左外连接在Oracle 9i以前的使用方式,结果相同,省略
SQL> select e.ename,d.dname
2 from emp e ,dept d
3 where e.deptno=d.deptno(+);
ENAME DNAME
---------- --------------
MILLER ACCOUNTING
KING ACCOUNTING
CLARK ACCOUNTING
FORD RESEARCH
ADAMS RESEARCH
SCOTT RESEARCH
JONES RESEARCH
SMITH RESEARCH
JAMES SALES
TURNER SALES
BLAKE SALES
ENAME DNAME
---------- --------------
MARTIN SALES
WARD SALES
ALLEN SALES
MATHA
已选择15行。
2.2.右外连接:
和左外连接类似,右外连接除了返回满足连接条件的记录,还可以返回那些不满足连接条件的操作符右边连接的其他记录。比如部门表中有一个部门40下是没有员工的,如果做等值连接部门40是不会被列出。下面的测试只是将左外连接的例子中的LEFT更改为RIGHT,查看结果:
SQL> select e.ename,d.dname
2 from emp e right outer join dept d
3 on (e.deptno=d.deptno);
ENAME DNAME
---------- --------------
KING ACCOUNTING
MILLER ACCOUNTING
CLARK ACCOUNTING
SMITH RESEARCH
FORD RESEARCH
ADAMS RESEARCH
SCOTT RESEARCH
JONES RESEARCH
JAMES SALES
ALLEN SALES
BLAKE SALES
ENAME DNAME
---------- --------------
MARTIN SALES
TURNER SALES
WARD SALES
OPERATIONS
已选择15行。
在Oracle 9i 之前,上述右外连接还可以写成下面这种方式:
SQL> select e.ename,d.dname
2 from emp e ,dept d
3 where e.deptno(+)=d.deptno;
ENAME DNAME
---------- --------------
KING ACCOUNTING
MILLER ACCOUNTING
CLARK ACCOUNTING
SMITH RESEARCH
FORD RESEARCH
ADAMS RESEARCH
SCOTT RESEARCH
JONES RESEARCH
JAMES SALES
ALLEN SALES
BLAKE SALES
ENAME DNAME
---------- --------------
MARTIN SALES
TURNER SALES
WARD SALES
OPERATIONS
已选择15行。
2.3.全外连接:
全外连接是指除了返回满足连接条件的记录,还会返回不满足连接条件的所有其他行,即是左外连接和右外连接查询结果的总和,如下例:
1 select e.ename,d.dname
2 from emp e full outer join dept d
3* on (e.deptno=d.deptno)
SQL> /
ENAME DNAME
---------- --------------
MILLER ACCOUNTING
KING ACCOUNTING
CLARK ACCOUNTING
FORD RESEARCH
ADAMS RESEARCH
SCOTT RESEARCH
JONES RESEARCH
SMITH RESEARCH
JAMES SALES
TURNER SALES
BLAKE SALES
ENAME DNAME
---------- --------------
MARTIN SALES
WARD SALES
ALLEN SALES
MATHA
OPERATIONS
已选择16行。
说明:OUTER是可以缺省的,结果是一样的,在Oracle 9i之前的语法中作外连接,只能实现左连接和右外连接,无法直接实现全外连接。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25815645/viewspace-708634/ ,如需转载,请注明出处,否则将追究法律责任。