首先建立兩張表:
-- 部門表
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. 左外連接:左外連接=內部連接+左邊表中失配元組
返回包括左表中的所有記錄和右表中聯結字段相等的記錄
--列出部門ID為3的部門和員工信息,不管該部門是否有員工
/*如果員工表作為做外鏈接的左邊,那么所有數據必須是員工表里
存在的數據,即先到員工表查數據,拿到這些數據再到右邊的部門表
一條一條查找,有就顯示,沒有就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