閱讀135 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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:55:00

  上一篇:go 如何正確地刷牙?
  下一篇:go 為什麼詐騙短信看上去那麼弱智?