左外连接,右外连接,全外连接,自然连接,自连接区别

首先建立两张表:

-- 部门表 

CREATE TABLE departments 

 depID  NUMBER(38,0), 

 depName VARCHAR2(20), 

 delFlag NUMBER(1,0) 

); 

 

-- 员工表 

CREATE TABLE employees 

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

posted on 2019-07-23 08:37  农夫三拳有點疼  阅读(8235)  评论(0编辑  收藏  举报

导航