连接查询
在应用中所需要的数据来自于一个表的情况非常少。经常会需要查询两个或两个 以上的表。这种查询两个或两个以上的数据表或试图的查询叫做连接查询。
表的连接查询包括等值连接、非等值连接、自连接、内连接和外连接,以等值连 接为例,下面描述连接查询的语法:
SELECT table1.column,table2.column FROM table1,table2 WHERE table1.column1 = table2.column2;
可以使用表的别名来简化连接查询。一旦给表定义了别名,在整个sql语句中就不能 再使用表的全名了,可以对比一下不使用或使用别名的效果。
--不使用别名 SELECT EMP.ENAME,DEPT.DNAME FROM EMP,DEPT WHERE EMP.DEPTNO = DEPT.DEPT.NO; --使用别名 SELECT E.ENAME,D.DNAME FROM EMP E,DEPT D WHERE E.DEPTNO = D.DEPT.NO;
-
等值连接
> 等值连接是连接查询中最常见的一种,通常是在有主外键关系的表间建立,并将连接 条件设定为有关系的列,使用 "=" 连接相关的表。 --例1: 等值连接查询 --查询职员表中的全部数据 SELECT E.ENAME,E.JOB,D.DNAME,D.LOC FROM SCOTT.EMP E,SCOTT.DEPT D WHERE E.DEPTNO = D.DEPTNO; --除了等值连接条件外还有其他连接条件 SELECT E.ENAME,SCOTT.DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10; 结果为: ![等值连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/25.png) ![等值连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/26.png) 也可以以此类推,对多个表做等值连接查询,多个表之间存在主从表关系,连接 条件同样写在WHERE子句中。为了避免笛卡尔积,连接n各表,最少需要n-1个 连接条件
-
非等值连接
> 非等值连接在多个表使用非等号连接,查询在多个表中有非等值关联关系的 数据,非等值连接符包括 >,>=,<,<=,<>以及 BETWEEN...AND,LIKE,IN等。 --例2: 非等值连接的查询 --查询每个职员的工资级别 SELECT E.ENAME,E.SAL,S.GRADE FROM SCOTT.EMP E,SCOTT.SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL; 结果为: ![等值连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/27.png)
-
自连接
> 自连接是一种比较特殊的连接查询,数据的来源是一个表,即关联关系来自于 单表中的多个列。表中的列参照同一个表中的其它列的情况称作自参表。 自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接。 --例3: 自连接 --查出每个职员经理的名字,以及他们的职员编码 SELECT WORKER.EMPNO W_EMPNO,WORKER.ENAME W_ENAME,MANAGER.EMPNO M_EMPNO,MANAGER.ENAME M_ENAME FROM SCOTT.EMP WORKER,SCOTT.EMP MANAGER WHERE WORKER.MGR = MANAGER.EMPNO; 结果为: ![自连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/28.png)
-
内连接和外连接
> 上面所介绍的连接查询都属于内连接,即返回满足连接条件的数据记录,在有些情况下,需要返回 那些不满足连接天剑的记录。在Oracle 9i版本之后外链接一般在FROM短句中指定。 Oracle 9i之后的外链接语法: SELECT table1.column,table2.column FROM table1 [INNER | LEFT | RIGHT | FULL] JOIN table2 ON table1.column1 = table2.column2; 1. ### 内连接 > 内连接返回所有满足连接条件的记录 --例4: 内连接(1) --使用等值连接的形式 SELECT E.ENAME,D.DNAME FROM SCOTT.EMP E,SCOTT.DEPT D WHERE E.DEPTNO = D.DEPTNO; 结果为: ![内连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/29.png) --例5: 内连接(2) --使用NATURAL JOIN对于,将两个表中所有同名列做等值连接。如果两个表中同名列数据 --类型不能比较的话,就会报错 SELECT E.ENAME,D.DNAME FROM SCOTT.EMP E NATURAL JOIN SCOTT.DEPT D; 结果为: ![内连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/30.png) --例6: 内连接(3) --使用USING子句实现,较NATURAL JOIN方式更灵活,是将两个表中指定的同名列做等值 --连接,避免了同名列可能因类型不同导致的错误。 SELECT E.ENAME,D.DNAME FROM SCOTT.EMP E JOIN SCOTT.DEPT D USING(DEPTNO); 结果为: ![内连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/30.png) --例7: 内连接(4) --使用ON子句。这种方式避免了第3种方式必须有同名列的缺陷,可以在ON子句中指定连接条件,--列名可以相同也可以不同。 SELECT E.ENAME,D.DNAME FROM SCOTT.EMP E JOIN SCOTT.DEPT D ON (E.DEPTNO = D.DEPTNO); 结果为: ![内连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/30.png) 2. ### 左外链接 > 外连接是内连接的一种扩展,做外链接是指不仅会返回满足连接条件的记录,还可以返回那些 不满足连接条件的操作符左边表的其它记录。 --例8: 左外连接 INSERT INTO SCOTT.EMP(EMPNO,ENAME) VALUES (1235,'MATHA'); SELECT E.ENAME,D.DNAME FROM SCOTT.EMP E LEFT OUTER JOIN SCOTT.DEPT D ON E.DEPTNO = D.DEPTNO; 结果为: ![左外连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/31.png) 3. ### 右外链接 > 右外连接除了返回满足连接条件的记录,还可以返回那些不满足连接条件的操作符右边表 的其它记录 --例9: 右外连接 SELECT E.ENAME,D.DNAME FROM SCOTT.EMP E RIGHT OUTER JOIN SCOTT.DEPT D ON E.DEPTNO = D.DEPTNO; 结果为: ![右外连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/32.png) 4. ### 全外连接 > 全外连接是指返回满足条件的记录,还会返回不满足连接条件的所有其他行,即使左链接和右连接的综合。 --例10: 全外连接 SELECT E.ENAME,D.DNAME FROM SCOTT.EMP E FULL OUTER JOIN SCOTT.DEPT D ON E.DEPTNO = D.DEPTNO; 结果为: ![全外连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/33.png) ![全外连接](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/34.png)原文链接:https://www.f2er.com/oracle/211055.html