Oracle查询优化-03操作多个表

2/13/2017来源:SQL技巧人气:806

3.1 记录集的叠加

问题

要将来自多个表的数据组织到一起,就像将一个结果集叠加到另外一个上面一样。 这些表不必有相同的关键字,但是他们对应列的数据类型必须相同。

解决方案

使用union all 把多个表中的行组合到一起。

select ename, deptno from emp where deptno = 10 union all select '-----', deptno from dept union all select dname, deptno from dept;

结论

UNION ALL将多个来源的行组合起来,放到一个结果集中。 所有select列表中的项目数和对应项目的数据类型必须要匹配。

UNION ALL会包括重复的项目,如果要筛选掉重复项,可以使用UNION运算符。

如果使用UNION而不是UNION ALL,很可能是为了去除重复项而进行排序操作。 在处理大结果集时要记住,使用UNION子句大致相当于下面的查询,对UNION ALL子句的查询结果使用DISTINCT子句

SQL> select distinct deptno 2 from (select deptno from dept 3 union all 4 select deptno from dept); DEPTNO ------ 30 20 40 10 SQL> SQL> select deptno 2 from dept 3 union 4 select deptno from dept 5 ; DEPTNO ------ 10 20 30 40 SQL> 通常,查询中不要使用distinct,除非确定有必要这样做; 对于UNION而言也是如初,除非确定有必要,一般使用UNION ALL,而不适用UNION。

3.2 组合相关的行

问题

多表有一些相同的列,或者有些列的值相同,需要通过关联这些列得到结果。

解决方案

select a.ename ,b.dname from emp a ,dept b where a.deptno = b.deptno and a.deptno = 10 ; select a.ename ,b.dname from emp a inner join dept b on a.deptno = b.deptno where a.deptno = 10 ;

结论

第二种解决方式是利用显示的JOIN子句(inner 关键字可省略),如果希望将联接逻辑关系放在from子句中,而不是在where 子句中,可以使用JOIN子句, 这两种方式都符合ANSI标准。


3.4 IN、EXISTS 和 INNER JOIN

问题

解决方案

结论


3.5 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 解析

问题

解决方案

结论


3.6 自关联

问题

解决方案

结论


3.7 NOT IN、NOT EXISTS 和 LEFT JOIN

问题

解决方案

结论


3.8 外连接中的条件不要乱放

问题

解决方案

结论


3.9 检测两个表中的数据及对应数据的条数是否相同

问题

解决方案

结论


3.10 聚集与内连接

问题

解决方案

结论


3.11 聚集与外连接

问题

解决方案

结论


3.12 从多个表中返回丢失的数据

问题

解决方案

结论


3.13 多表查询时的空值处理

问题

解决方案

结论