SQL–Oracle 區分外連接內連接
一、表解構和數據
INSERT INTO "XIELONG"."S_EMP_TEST" (ID, NAME) VALUES ('1', 'a')
INSERT INTO "XIELONG"."S_EMP_TEST" (ID, NAME, M_ID) VALUES ('2', 'b', '1')
INSERT INTO "XIELONG"."S_EMP_TEST" (ID, NAME, M_ID) VALUES ('3', 'c', '1')
INSERT INTO "XIELONG"."S_EMP_TEST" (ID, NAME, M_ID) VALUES ('4', 'd', '2')
INSERT INTO "XIELONG"."S_EMP_TEST" (ID, NAME, M_ID) VALUES ('5', 'e', '2')
二、內連接和外連接定義
內連接:
- 定義:最常用也是最重要的結合就是等值連接,也被稱爲內部結合、內連接。通常利用通用字段結合兩個表,而這個字段通常是每個表裏的主鍵。
- 用途:需要取出兩張或以上的表格的數據,需要用到內連接。
- 語法:
--1、where的方式
SELECT * FROM S_EMP E, S_DEPT D WHERE E.DEPT_ID=D.ID;
--2、join on
SELECT * FROM S_EMP E join S_DEPT D on E.DEPT_ID=D.ID;
--3、inner join on
SELECT * FROM S_EMP E inner join S_DEPT D on E.DEPT_ID=D.ID;
- 案例:
--內連接 兩張表的數據
select * from s_emp_test e1, s_emp_test e2 where e1.id=e2.m_id;
--內連接 一張表的數據 有重複
select e1.* from s_emp_test e1, s_emp_test e2 where e1.id=e2.m_id;
外連接:
-
定義
- 外連接的結果集, 等於內連接的結果集,加上匹配不上的記錄!
- 通過在字段後面添加(+), 來完成外連接操作。
- 外連接會返回一個表裏的全部記錄,即使對應的記錄在第二個表裏不存在。加號(+)
用於在查詢裏表示外部結合,放在WHERE子句裏表名的後面,具有加號的表是沒有匹配記 錄的表.在很多實現裏。
-
分類:外連接被劃分爲左外連接、右外連接和全外連接。
-
語法:
外部結合的-般語法如下所示
FROM TABLEl
{RIGHT | LEFT | FULL} [OUTER] JOIN
ON TABLE2
Oracle 的語法是
From TABLE1 , TABLE2 [,TABLE3]
WHERE TABLE1.COLUMN_NAME[(+)] = TABLE2.COLUMN_NAME[(+)]
[ AND TABLE1.COLUMN_NAME[(+)] = TABLE3.COLUMN_NAME[(+)] ]
- 實例:
- 表結構:如上圖表s_emp_test的數據
- 外連接實例:
--內連接 一張表的數據 有重複
select e1.* from s_emp_test e1, s_emp_test e2 where e1.id=e2.m_id;
-- 外連接 (+)在=前 e2表中的數據全部展示出來,不符合條件的用NULL補充
select * from s_emp_test e1, s_emp_test e2 where e1.id(+)=e2.m_id;
-- 外連接 (+)在=和字段後 e1表中的數據全部展示出來,不符合條件的用NULL補充
select * from s_emp_test e1, s_emp_test e2 where e1.id=e2.m_id(+);
-- 查詢普通員工(非領導的員工信息)根據上面的外連接(+)在後面,外連接補NULL,然後用e2表的ID is null 取出員工號
select * from s_emp_test e1, s_emp_test e2 where e1.id=e2.m_id(+) and
e2.id is null;
--查詢普通員工的另一種方式
select e2.* from s_emp_test e1, s_emp_test e2 where e1.m_id(+)=e2.id
and e1.m_id is null;