Oracle学习(5)---数据定义语言---连接查询

2017-01-03 10:11:50来源:oschina作者:为为02人点击

第七城市


# 连接查询
[源码项目地址](https://git.oschina.net/weiwei02/OracleDemo)
_在应用中所需要的数据来自于一个表的情况非常少。经常会需要查询两个或两个
以上的表。这种查询两个或两个以上的数据表或试图的查询叫做连接查询。_
表的连接查询包括等值连接、非等值连接、自连接、内连接和外连接,以等值连
接为例,下面描述连接查询的语法:
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. ## 等值连接
> 等值连接是连接查询中最常见的一种,通常是在有主外键关系的表间建立,并将连接
条件设定为有关系的列,使用 "=" 连接相关的表。
--例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, E.JOB, D.DNAME, D.LOC
FROM SCOTT.EMP E, SCOTT.DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND E.DEPTNO = 10;
结果为: ![等值连接](/2014th7cj/d/file/p/20170103/c0bsrmouifb.png)
![等值连接](/2014th7cj/d/file/p/20170103/4lmxcc52i1k.png)
也可以以此类推,对多个表做等值连接查询,多个表之间存在主从表关系,连接
条件同样写在WHERE子句中。为了避免笛卡尔积,连接n各表,最少需要n-1个
连接条件
2. ## 非等值连接
> 非等值连接在多个表使用非等号连接,查询在多个表中有非等值关联关系的
数据,非等值连接符包括 >, >= , <, <=, <>以及 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;
结果为: ![等值连接](/2014th7cj/d/file/p/20170103/0mxxgsdb23v.png)
3. ## 自连接
> 自连接是一种比较特殊的连接查询,数据的来源是一个表,即关联关系来自于
单表中的多个列。表中的列参照同一个表中的其它列的情况称作自参表。
自连接是通过将表用别名虚拟成两个表的方式实现,可以是等值或不等值连接。
--例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;
结果为: ![自连接](/2014th7cj/d/file/p/20170103/vo2lytg5dwm.png)
3. ## 内连接和外连接
> 上面所介绍的连接查询都属于内连接,即返回满足连接条件的数据记录,在有些情况下,需要返回
那些不满足连接天剑的记录。在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;
结果为: ![内连接](/2014th7cj/d/file/p/20170103/vw1m3pc0i3l.png)
--例5: 内连接(2)
--使用NATURAL JOIN对于,将两个表中所有同名列做等值连接。如果两个表中同名列数据
--类型不能比较的话,就会报错
SELECT E.ENAME, D.DNAME
FROM SCOTT.EMP E NATURAL JOIN SCOTT.DEPT D;
结果为: ![内连接](/2014th7cj/d/file/p/20170103/kdydji2v45v.png)
--例6: 内连接(3)
--使用USING子句实现,较NATURAL JOIN方式更灵活,是将两个表中指定的同名列做等值
--连接,避免了同名列可能因类型不同导致的错误。
SELECT E.ENAME, D.DNAME
FROM SCOTT.EMP E JOIN SCOTT.DEPT D
USING(DEPTNO);
结果为: ![内连接](/2014th7cj/d/file/p/20170103/kdydji2v45v.png)
--例7: 内连接(4)
--使用ON子句。这种方式避免了第3种方式必须有同名列的缺陷,可以在ON子句中指定连接条件,
--列名可以相同也可以不同。
SELECT E.ENAME, D.DNAME
FROM SCOTT.EMP E JOIN SCOTT.DEPT D
ON (E.DEPTNO = D.DEPTNO);
结果为: ![内连接](/2014th7cj/d/file/p/20170103/kdydji2v45v.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;
结果为: ![左外连接](/2014th7cj/d/file/p/20170103/ehm5z1pnfdg.png)
3. ### 右外链接
> 右外连接除了返回满足连接条件的记录,还可以返回那些不满足连接条件的操作符右边表
的其它记录
--例9: 右外连接
SELECT E.ENAME, D.DNAME
FROM SCOTT.EMP E RIGHT OUTER JOIN SCOTT.DEPT D
ON E.DEPTNO = D.DEPTNO;
结果为: ![右外连接](/2014th7cj/d/file/p/20170103/jmyyezu3tv5.png)
4. ### 全外连接
> 全外连接是指返回满足条件的记录,还会返回不满足连接条件的所有其他行,
即使左链接和右连接的综合。
--例10: 全外连接
SELECT E.ENAME, D.DNAME
FROM SCOTT.EMP E FULL OUTER JOIN SCOTT.DEPT D
ON E.DEPTNO = D.DEPTNO;
结果为: ![全外连接](/2014th7cj/d/file/p/20170103/s5vo5vwlixo.png)
![全外连接](/2014th7cj/d/file/p/20170103/0vf0dfyrolr.png)[源码项目地址](https://git.oschina.net/weiwei02/OracleDemo)
第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台