左外链接,右外链接,全外链接,天然链接,自链接区别

首先创建两张表:spa

-- 部门表  blog

CREATE TABLE departments 产品

it

 depID  NUMBER(38,0), io

 depName VARCHAR2(20), class

 delFlag NUMBER(1,0) date

); 数据类型

 

-- 员工表  方法

CREATE TABLE employees im

empID  NUMBER(38,0), 

empName VARCHAR2(20), 

depID  NUMBER(38,0), 

delFlag NUMBER(1,0) 

);

插入数据: 

INSERT INTO departments VALUES(1,'Finacle',0); 

INSERT INTO departments VALUES(2,'Marketing',0); 

INSERT INTO departments VALUES(3,'HR',1); 

INSERT INTO departments VALUES(4,'IT',0); 

 

INSERT INTO employees VALUES(001,'wbq',1,0); 

INSERT INTO employees VALUES(002,'czh',2,0); 

INSERT INTO employees VALUES(003,'chh',1,0); 

INSERT INTO employees VALUES(004,'wal',2,0); 

INSERT INTO employees VALUES(005,'ddd',3,0); 

INSERT INTO employees VALUES(006,'ddd',5,0); 

INSERT INTO employees VALUES(007,'ddd',6,0);

 

1. 左外链接:左外链接=内部链接+左边表中失配元组 

返回包括左表中的全部记录和右表中联结字段相等的记录

 

--列出部门ID3的部门和员工信息,无论该部门是否有员工 

/*若是员工表做为作外连接的左边,那么全部数据必须是员工表里 

存在的数据,即先到员工表查数据,拿到这些数据再到右边的部门表 

一条一条查找,有就显示,没有就null

*/ 

SELECT d.depID,d.depName,e.empid,e.empName 

FROM departments d 

LEFT OUTER JOIN employees e 

ON d.depID = e.depID 

ORDER BY d.depID;

 

SELECT d.depID,d.depName,e.empid,e.empName 

FROM departments d, employees e 

WHERE d.depID = e.depID(+) 

ORDER BY d.depID;

/* 总结:左外链接就是把左边的数据做为查询条件, 

 一条一条去右边查询,若是有就显示,没有就为null

*/ 

2.右外链接:右外链接=内部链接+右边表中失配元组

返回包括右表中的全部记录和左表中联结字段相等的记录

 

/*若是部门表做为作外连接的左边,那么全部数据必须是部门表里 

存在的数据,即先到部门表查数据,拿到这些数据再到右边的员工表 

一条一条查找,有就显示,没有就null

*/ 

 SELECT d.depID,d.depName,e.empid,e.empName 

 FROM departments d   

 RIGHT OUTER JOIN employees e  

 ON e.depID=d.depID  

 ORDER BY d.depID;

 

SELECT d.depID,d.depName,e.empid,e.empName 

FROM employees e,departments d   

WHERE  e.depID=d.depID(+)  

ORDER BY d.depID;

--若是使用(+),那(+)在哪边,那边就是被链接的表, 

--它的数据是可选的(有就显示,没有就null,条件是没有(+)的表每一条做为查询条件)

3.全外链接:查询结果等于左外链接和右外链接的和

--FULL OUTER JOIN:全外链接  

  

SELECT d.depID,d.depName,e.empid,e.empName 

FROM departments d 

FULL OUTER JOIN employees e 

ON d.depID = e.depID 

ORDER BY d.depID; 

4.天然链接:(列不能加限定条件)

属性值相同的就保留下来,若是属性值不相同则去掉,链接后的表的属性值个数为原来两个表的属性之和减去公共属性的个数,若是两个表没公共属性则天然链接就是笛卡尔乘积。

天然链接是在广义笛卡尔积R×S中选出同名属性上符合相等条件元组,再进行投影,去掉重复的同名属性,组成新的关系。

天然链接是在两张表中寻找那些数据类型和列名都相同的字段,而后自动地将他们链接起来,并返回全部符合条件按的结果。(inner join的结果包含重复属性,而且链接方式区别于天然链接)

SELECT *  FROM departments NATURAL JOIN employees

 

一个简单的例子,将下列关系R和S进行天然链接:

R:

A B C

a b c

b a d

c d e

d f g

 

S:

A C D

a c d

d f g

b d g

首先要对两个关系中相同属性组的份量进行相等比较,即比较R.A,R.C 和 S.A , S.C;

因 R中AC属性第一行元组份量a、c与S中AC属性第一行元组份量a、c相等 选取为结果之一

因 R中AC属性第二行元组份量b、d与S中AC属性第三行元组份量b、d相等 选取为结果之一

因 S中AC属性第三行元组份量d、f与R中AC属性各个元组份量均不等 不选取

其他属性不重复则保留,且保留的份量为选取的元组同组份量。

所以进行链接获得结果:

A B C D

a b c d

b a d g

5.自链接

链接的表是同一张表,使用自链接能够将自身表的一个镜像看成另外一个表来对待,从而可以获得一些特殊的数据。若是要查询A表中相关信息,能够用自链接。

 

eg、使用自链接进行查询,要求从工资表中查询到工资比产品经理多的全部工资信息(自链接是指使用表的别名实现表与其自身链接的查询方法)

Select sal.position,sal.position_grade,sal.salary,sal.salary_card,sal.salary_date

from salary sal,salary sal2

where sal2.position='产品经理'

and sal.salary>sal2.salary

order by sal.salary

 

 

SELECT E1.ENAME, E1.ENAME, E1.JOB, E1.SAL FROM EMP E1, EMP E2

WHERE E2.EMPNO=7888

AND  E1.SAL>E2.SAL

ORDER BY E1.SAL

 

 

子查询:

SELECT ENAME, ENAME, JOB, SAL FROM EMP

WHERE SAL>

(SELECT SAL FROM EMP WHERE EMPNO=7888)

ORDER BY SAL