左外鏈接,右外鏈接,全外鏈接,天然鏈接,自鏈接區別

首先創建兩張表: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

相關文章
相關標籤/搜索