多關係連線查詢(內,外,自身連線)
先創兩張表做例子,一張部門表,一張員工表
部門表(dept):
員工表(emp):
1.內連線
一般格式:
select[distinct/all]<目標列表達式[別名]清單>
from<關係名1[別名1]>inner join<關係名2[別名2]>
on<連線條件表示式>;
或
select[distinct/all]<目標列表達式[別名]清單>
from<關係名[別名]清單>
where<連線表示式>;
需要連線查詢的關係名在from子句中指定,連線型別和連線條件可以在from子句或者where子句中指定。例::
SELECT e.ename,e.job,e.deptno,d.deptno,d.dname
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno;
或:
SELECT e.ename,e.job,e.deptno,d.deptno,d.dname
FROM emp e,dept d
WHERE e.deptno = d.deptno;
注:上述命令中“e”,“d”分別表示部門表和員工表的別名,此處只是為了簡化表名,但是一旦為關係名指定了別名,則在該命令中必須用別名代替該關係名。
輸出結果(部分):
內連線是使用最多的一種連線型別。在連線的兩表中只有滿足連線條件的元組,才作為結果輸出。
2.外連線,又分為左外連線(Left Join),右外連線(Right Join),全外連線(Full Join);
- 左外連線:除了返回兩表中滿足條件的元組以外,還返回左側表中不匹配元組,右側表中以空值(NULL)替代:
- 先插入一條新資料:
INSERT INTO dept VALUES(60,’OPERATIONS’,’BOSTON’);
然後執行命令:
SELECT e.ename,e.job,e.deptno,d.deptno,d.dname
FROM dept d LEFT JOIN emp e
ON e.deptno = d.deptno;
此時由於我們剛加入的部門編號為60但是員工表中沒有對應部門編號為60的員工,所以以NUll補全。
結果: - 右外連線:除了返回兩表中滿足條件的元組以外,還返回右側表中不匹配元組,左側表中以空值(NULL)替代:同理,插入一條部門編號為70的資料:
INSERT INTO emp VALUES(7788,’LUCE’,’ANALYST’,’1983-4-19’,2700.00,70);
然後執行:
SELECT e.ename,e.job,e.deptno,d.deptno,d.dname
FROM dept d RIGHT JOIN emp e
ON e.deptno = d.deptno;
結果: - 全外連線:除了返回兩表中滿足條件的元組以外,還返回左側表中不匹配元組,右側表中以空值(NULL)替代,以及右側表中不匹配元組,左側表中以空值(NULL)替代
重點區別:等值連線是隻把滿足條件的兩個表的行相連,然後顯示出來。完全外連線是把匹配查詢條件的行、左表沒有匹配到的、右表沒有匹配到的都顯示出來
3.自身連線
有時,一些特殊的查詢需要對同一個關係進行連線查詢,成為表的自身連線:
例:要找到某人的間接負責人,則要先找到他的直接負責人,然後通過找他直接負責人的負責人找到某人的間接負責人。
—-先建立兩張相同的表:
emp01:
emp02:
執行命令:
SELECT e1.Eno,e2.Emgr
FROM emp01 e1,emp02 e2
WHERE e1.Emgr
=e2.Eno
結果:
這就找到了間接負責人。