1. 程式人生 > >多關係連線查詢(內,外,自身連線)

多關係連線查詢(內,外,自身連線)

先創兩張表做例子,一張部門表,一張員工表

部門表(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

結果:
這裡寫圖片描述
這就找到了間接負責人。