Oracle 連接查詢
背景:
emp表中有14條記錄:
dept表中4條記錄:
salgrade表中有5條記錄:
一、交叉連接(CROSS JOIN)
交叉連接(CROSS JOIN):有兩種,顯式的和隱式的,不帶ON子句,返回的是兩表的乘積,也叫笛卡爾積。
例如:下麵的語句1和語句2的結果是相同的(均為56條記錄)。
語句1:隱式的交叉連接,沒有CROSS JOIN。
select empno,ename,sal,dname,loc from emp,dept語句2:顯式的交叉連接,使用CROSS JOIN
select empno,ename,sal,dname,loc from emp CROSS JOIN dept
二、內連接
內連接是根據指定的連接條件進行連接查詢,隻有滿足連接條件的數據才會出現在結果集中。
當執行兩個表內連接查詢的時,首先在第一個表中查找到第一個記錄,然後從頭開始掃描第二個表,逐一查找滿足條件的記錄,找到後將其與第一個表中的的第一個記錄拚接形成結果集中的第一個記錄。當第二個表被掃描一遍後,再從第一個表中查詢第二個記錄,然後再從頭掃描第二個表,逐一查找滿足條件的記錄,找到後將其與第一個表中的第二個記錄拚接形成結果集中的一個記錄。重複執行,知道第一個表中的全部記錄都處理完畢為止。
1. 相等連接
通過兩個表具有相同意義的列,可以建立相等連接條件。隻有連接列上在兩個表中都出現且值相等的行才會出現在查詢結果中。
例如,查詢10號部門員工的員工號、員工名、工資、部門號和部門名:
SELECT empno,ename,sal,emp.deptno FROM EMP join DEPT on EMP.DEPTNO = DEPT.DEPTNO and EMP.DEPTNO=10結果如下圖:
2、不相等連接
如果連接條件中的運算符不是等號而是其他關係的運算符,這成為不相等連接。
例如,查詢10號部門員工的工資等級:
select empno,ename,sal,grade from emp join salgrade on sal>losal and sal<hisal and deptno=10
結果如下圖:

3、自身連接
自身連接是指在同一個表或者視圖中進行連接,相當於同一個表作為兩個或多個表使用。
例如:查詢所有員工的員工號、員工名與該員工領導的員工名、員工號:
select work.empno,work.ename,manager.empno,manager.ename from emp work join emp manager on work.mgr=manager.empno結果如下圖:
三、外連接
外連接是指在內連接的基礎上,將某個連接表中不符合連接條件的記錄加入到結果集中。
在左外連接和右外連接時都會以一張表為基表,該表的內容會全部顯示,然後加上兩張表匹配的內容。 如果基表的數據在另一張表沒有記錄。 那麼在相關聯的結果集行中列顯示為空值(NULL)。
1、 左外連接
左外連接是指在內連接的基礎上,將連接操作符左側表中不符合連接條件的記錄加入到結果集中,與之對應的連接操作符右側表列用NULL填充。
例如,查詢10號部門的部門名 、員工號、員工名和所有其他部門的名稱:
select dname,empno,ename from dept left join emp on dept.deptno=emp.deptno and dept.deptno=10;
在這個例子中,首先要保證的是:我要查出10號部門的部門名稱,即使10號部門中一個員工也沒有,也要顯示10號部門所有的部門名稱,而部門名稱在dept表中,故dept表放在左側,有匹配數據的前三行就是用Join時,查出的數據,即滿足On條件的數據。
結果如下圖:
小注:關於left join的個人理解
假如說你有兩個表,資金結算單據(JSDJXX)、位信息(DWXX)
一個表用來存放資金結算單據的信息(資金結算單據中肯定有單位嘛,但資金結算單據中得單位信息肯定是編號),另一個表用來存放單位信息(單位表裏的數據比如會有:單位編號、單位名稱、單位內碼等等),現在我要查資金結算單據的信息,同時我又想讓資金結算單據中的單位信息不顯示編號,而是顯示單位名稱,這時候,我就需要用left join來關聯單位信息表,因為我需要的數據是資金結算單據中的信息,即使在單位信息表表查不到某個單位編號對應的單位名稱,這條數據我還是要顯示的嘛,所以用left join而不是join。
SELECT JSDJXX_DWBH,DWXX_DWMC from JSDJXX left JOIN DWXX ON JSDJXX_DWBH = DWXX_DWBH
通過執行上麵的SQL,獲取ds,我就可以在往Gridcontrol上綁定數據的時候,綁定單位名稱。
比如:
SELECT JSDJXX_DWBH,DWXX_DWMC as DWMC from JSDJXX left JOIN DWXX ON JSDJXX_DWBH = DWXX_DWBH在Dev Gridcontrol上綁定列名的時候就可以用DWMC,即可。
2、 右外連接
右外連接是指在內連接的基礎上,將連接操作符右側表中不符合連接條件的記錄加入到結果集中,與之對應的連接操作符左側表列用NULL填充。
例如,查詢20號部門的部門名稱及其員工號、員工名和所有其他部門的員工號、員工名:
select empno ,ename,dname from dept right join emp on dept.deptno=emp.deptno and dept.deptno=20;結果如下圖:
3、 全連接
全外連接是指在內外連接的基礎上,將連接操作符兩側表中不符合的記錄加入到結果集中。
例如,查詢所有的部門名和員工名:
select dname,ename from emp full join dept on emp.deptno=dept.deptno結果如下圖:
小注:
1、左右外連接小結:
左外連接(LEFT OUTER JOIN)告訴DBMS生成的結果表中,除了包括匹配行外,還包括JOIN關鍵字(FROM子句中)左邊表的不匹配行。左外連接實際上可以表示為:
左外連接 = 內連接 + 左邊表中失配的元組
其中,缺少的右邊表中的屬性值用NULL表示。
右外連接(RIGHT OUTER JOIN)告訴DBMS生成的結果表中,除了包括匹配行外,還包括JOIN關鍵字(FROM子句中)右邊表的不匹配行。右外連接實際上可以表示為:
右外連接 = 內連接 + 右邊表中失配的元組
其中,缺少的左邊表中的屬性值用NULL表示。
全外連接(FULL OUTER JOIN)告訴DBMS生成的結果表中,除了包括匹配行外,還包括JOIN關鍵字(FROM子句中)左邊表和右邊表的不匹配行。全外連接實際上可以表示為:
全外連接 = 內連接 + 左邊表中失配的元組 + 右邊表中失配的元組。
其中,缺少的左邊表或者右邊表中的屬性值用NULL表示。
2、類似文章推薦:點擊打開鏈接
3、小結
下麵列出了您可以使用的 JOIN 類型,以及它們之間的差異。
- JOIN: 如果表中有至少一個匹配,則返回行。例子:點擊打開鏈接
- LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行。例子:點擊打開鏈接
- RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行。例子:點擊打開鏈接
- FULL JOIN: 隻要其中一個表中存在匹配,就返回行。例子:點擊打開鏈接
最後更新:2017-04-03 12:54:58