Oracle多表联合查询

时间:2022-11-06 00:24:25

多表联合查询:通过连接可以建立多表查询,多表查询的数据可以来自多个表,但表之间必须有适当的连接条件。为了从多张表中查询必须识别连接多张表的公共列。一般条件都置于where子句中。一般N个表进行连接,至少需要N-1个连接条件,才能够正确连接。

两个表的连接方式有:1.相等连接 2.不等连接 3.外连接 4.自连接

1.相等连接:通过两个表具有相同意义的列,可以建立相等连接条件。使用相等连接进行两个表的查询时,只有连接列上在两个表中都出现且值相等的行才会出现在查询结果中。

 

显示雇员的名称和所在部门的编号和名称。执行一下查询:

select emp.ename,emp.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno;

执行结果如下:

ENAME                              DEPTNO                               DNAME

------------                      -----------------                         -------------

SMITH                              20                                        RESEARCH

ALLEN                              30                                        SALES

说明:相等连接语句的格式要求是,在FROM从句中一次列出两个表的名称,在表的每个列前需要添加表明,用“.”分隔,表示列属于不同的表,在WHERE条件中指明相等连接的列。
以上语句中不在两个表中同时出现的列,可以省略表明前缀,即可以简化为如下:
select ename,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno;
2.外连接
在以上的例子中,相等连接还有个问题:如果某个雇员的部门没有填写,即保留为空,那么该雇员在查询中就不会出现;或者某个部门没有雇员,那么在查询中该部门也不会出现。为了解决这个问题可以用外连,即除了显示满足相等连接条件的记录外还显示那些不满足连接条件的行,不满足连接条件的行将显示在最后,外连操作符为(+),它可以出现在相等连接条件的左侧或右侧,出现在左侧或右侧的含义有所不同,如下例子说明:
根据外连显示不满足条件的记录。
步骤1:显示雇员的名称、工资和所在部门名称及没有任何雇员的部门。
执行以下SQL语句:
select ename,sale,dname from emp,dept where emp.deptno(+)=dept.deptno;
执行结果为:

ENAME           SALE             DNAME
------         --------        ---------
CLARK           2450            ACCOUNTING
KING            5000            ACCOUNTING
MILLTER         1300            ACCOUNTING
...             
TURNER          1500             SALES
WARD            1250             SALES
                                OPERATIONS

3.不等连接
进行不等的连接。一下是一个训练实例,其中用的salgrade表的结构如下:
DESC salgrade
名称            是否为空         类型
GRADE              NUMBER
LOSAL                            NUMBER
HISAL                            NUMBER

GRADE表示工资等级,LOSAL和HISAL分别表示某等级工资的上限和下限
表的内容为:
select * FROM salgrade;
执行结果:
GRADE       LOSAL      HISAL
1           700        1200
2           1201       1400
3           1401       2000
4           2001       3000
5           3001       9999
显示雇员名称,工资和所属等级,执行一下语句:
select e.ename,e.sale,s.grade from emp e, salegrade s where e.