oracle开发之<<SQL Cookbook>>学习笔记整理:第三章 操作多个表

1.union all只是结果集叠加,union叠加后去重。

2.使用join实现表的关联,笛卡尔积:cross join, 等值连接:inner join, 左连接:left join, 右连接:right join, 全连接:full outer join。

3.使用intersect和in配合也可以实现等值连接,intersect返回两个行来源中的共同行,且不返回重复行。

SELECT empno,
       ename,
       job,
       sal,
       deptno
    FROM emp
 WHERE (ename,job,sal) IN
(SELECT ename,
        job,
        sal 
      FROM emp
    INTERSECT
 SELECT ename,
        job,
        sal
      FROM v);

4.用minus实现结果集相减,基本等价于not in,注意not in不去重且不能处理空值(会返回NULL,因为not in等价于not or,"TRUE OR NULL"结果为TRUE, "FALSE OR NULL"结果为NULL),minus去重且可以空值,解决空值问题可以用not exists.

5.使用反连接(外连接+NULL筛选)来查找与其他表不匹配的记录,示例如下:

SELECT d.* FROM 
  dept d LEFT OUTER JOIN emp e
    ON (d.deptno=e.deptno)
WHERE e.deptno IS NULL

6.使用外连接或标量子查询来向结果中添加列,示例如下:

select e.ename,d.loc,eb.received                     
from emp e join deptno d
on (e.deptno=d.deptno)               
left join emp_bonus eb
on (e.empno=eb.empno)
order by 2
等价于
select e.ename,d.loc,
(select eb.received from  emp_bonus eb
where e.empno=eb.empno) as received
from emp e,deptno d
where e.deptno=d.deptno
order by 2

7.找出两个表中不同的数据:

思路:(1)首先找出表EMP中存在而视图V中没有的行;

         (2)然后合并在视图V中存在而表EMP中没有的行。

技巧:MINUS+UNION ALL

8.聚集和关联一起使用时,先聚集再关联,或者先去重再关联,避免产生笛卡尔积导致汇总结果不对。

9.full outer join = left outer jion + union + right outer join.

         

原文地址:https://www.cnblogs.com/davidxu/p/6479284.html