日期:2014-05-16  浏览次数:20626 次

oracle连接中的那些事~

两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(右) 外联接。
两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行 ,这种连接称为满 外联接。



内连接

select empno,ename,sal,dname,loc from emp,dept 

where emp.deptno=dept.deptno; 


外连接

SELECT emp.column, dept.column --右外连接 

FROM emp, dept

WHERE emp.column(+) = dept.column; 

SELECT emp.column, dept.column --左外连接 

FROM emp, dept

WHERE emp.column = dept.column(+); 

外连接的符号是(+),(+)要放在字段名后。(+)对面的那个表,会全部显示。 

左外连接时,加号在等号的右边 

select d.dname,e.ename,e.deptno

from dept d,emp e 

where d.deptno = e.deptno(+) 

order by d.deptno; 

右外连接

select empno, ename, job, sal, dept.deptno, dname, loc 

2 from emp, dept 

3 where emp.deptno(+) = dept.deptno; 


满外联接

SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
FULL OUTER JOIN departments d
ON   (e.department_id = d.department_id) ;


自连接:

把表自身的镜像当成另外一个表

SELECT worker.last_name || ' works for ' 
       || manager.last_name
FROM   employees worker, employees manager
WHERE  worker.manager_id = manager.employee_id ;


笛卡尔集

笛卡尔集会在下面条件下产生:
省略连接条件
连接条件无效
所有表中的所有行互相连接
为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件。
在实际运行环境下,应避免使用全笛卡


叉集


使用CROSS JOIN 子句使连接的表产生叉集。
叉集和笛卡尔集是相同的。 


SELECT last_name, department_name
FROM   employees
CROSS JOIN departments ;


自然连接

NATURAL JOIN 子句,会以两个表中具有相同名字的列为条件创建等值连接。
在表中查询满足等值条件的数据。
如果只是列名相同而数据类型不同,则会产生错误。


SELECT department_id, department_name,
       location_id, city
FROM   departments
NATURAL JOIN locations ;


使用 USING 子句创建连接

在NATURAL JOIN 子句创建等值连接时,可以使用 USING 子句指定等值连接中需要用到的列。
使用 USING 可以在有多个列满足条件时进行选择。
不要给选中的列中加上表名前缀或别名。
NATURAL JOIN 和 USING 子句经常同时使用。

SELECT e.employee_id, e.last_name, d.location_id
FROM   employees e JOIN departments d
USING (department_id) ;


使用ON 子句创建连接

自然连接中是以具有相同名字的列为连接条件的。
可以使用 ON 子句指定额外的连接条件。
这个连接条件是与其它条件分开的。
ON 子句使语句具有更高的易读性。


SELECT e.employee_id, e.last_name, e.department_id, 
       d.department_id, d.location_id
FROM   employees e JOIN departments d
ON     (e.department_id = d.department_id);


使用 ON 子句创建多表连接


SELECT employee_id, city, department_name
FROM   employees e JOIN departments d
ON     d.department_id = e.department_id 
JOIN   locations l
ON     d.location_id = l.location_id;