Oracle_SQL_day03_ 多表查詢之 :連接查詢

  1. 內(nèi)連接 :語(yǔ)法
 SELECT table1.column,table2.column
FROM table1
JOIN table2
ON table1.column_name = table2.column_name

內(nèi)連接原理:

t1表和t2表做內(nèi)連接,連接條件為on t1.c1 = t2.c2,假設(shè)t1表做驅(qū)動(dòng)表,t2表做匹配表,記錄的匹配過程如下:

  1. 從t1表中讀取第一條記錄r1,若它的c1值為1
  2. 根據(jù)該值到t2表中查找匹配的記錄,即需要遍歷t2表,從t2表中的第一條記錄開始,若該記錄(r1)的c2列的值等于1,我們就說這兩條記錄能夠匹配上,那么t1的r1和t2的r1組合起來,作為結(jié)果集里的一條記錄,否則檢測(cè)t2表中的下一條記錄。
  3. 按照方法2依次將t2表中所有的記錄檢測(cè)一遍,只要匹配就放入結(jié)果集中
  4. 從t1表中讀取第二條記錄,依次重復(fù)步驟2和3,產(chǎn)生最終的結(jié)果集

t1表和t2表做內(nèi)連接,連接條件為on t1.c1 = t2.c2,
假設(shè)t1表做驅(qū)動(dòng)表,t2表做匹配表,記錄的匹配有如下三
種情況:

  1. t1表中的某條記錄在t2表中找不到任何一條匹配的記錄,那么t1表中的該記錄不會(huì)出現(xiàn)在結(jié)果集中
  2. t1表中的某條記錄在t2表中只有一條匹配的記錄,那么t1表中的該記錄和t2表中匹配的記錄組合成新記錄出現(xiàn)在結(jié)果集中
  3. t1表中的某條記錄在t2表中有多條匹配的記錄,那么t1表中的該記錄會(huì)和t2表中每一條匹配的記錄合成新記錄出現(xiàn)在結(jié)果集中

內(nèi)連接的核心為:任何一張表里的記錄一定要在另一張表中
找到匹配的記錄,否則不能出現(xiàn)在結(jié)果集中t1表和t2表做內(nèi)連接,連接條件為on t1.c1 = t2.c2有兩種方式都能得到結(jié)果集記錄

  1. 一種t1表做驅(qū)動(dòng)表,t2表做匹配表
  2. 另一種t2表做驅(qū)動(dòng)表,t1表做匹配表
  3. 無論哪種方式最終得到的結(jié)果集都一樣,所不同的是效率

內(nèi)連接的三種形式

等值連接
非等值連接
自連接

等值連接

等值連接:兩張表有描述共同屬性的列,常見形式為父表的主鍵和子表的外鍵相等
等值連接 :

SELECT e.ename, e.sal, d.dname
FROM emp e JOIN dept d
ON e.deptno = d.deptno
AND e.job = ‘MANAGER’;

職位是經(jīng)理(MANAGER)的員工屬于哪些部門
先用條件e.job = ‘MANAGER’對(duì)emp表進(jìn)行過濾,結(jié)果集再和dept表進(jìn)行內(nèi)連接
如果把查詢的結(jié)果看成一張表,該查詢就是把兩張表的數(shù)據(jù)通過表連接的方式合成一張新表

非等值連接:

-可以用BETWEEN AND這樣的非等值運(yùn)算符將兩張表中的列寫成一個(gè)表達(dá)式
-所謂表之間的關(guān)系,實(shí)際指表中的行(記錄)之間的關(guān)系。該關(guān)系通過將表中的列寫成表達(dá)式來體現(xiàn)

SELECT e.ename,e.sal,s.grade
FROM emp e JOIN salgrade s
ON e.sal BETWEEN s.losal AND s.hisal
列出每個(gè)員工的名字、工資以及工資級(jí)別

自連接

-同一張表的列之間有關(guān)系實(shí)際反映的是同一張表的行(記錄)之間有關(guān)系
-通過給表起別名將同一張表的列之間的關(guān)系轉(zhuǎn)換成不同表的列之間的關(guān)系

SELECT e.ename employee,m.ename manager
FROM emp e JOIN emp m
ON e.mgr = m.empno
列出員工的名字及他們的直接領(lǐng)導(dǎo)的名字(不包括最高領(lǐng)導(dǎo))
  1. 外連接 :語(yǔ)法
SELECT table1.column,table2.column
FROM table1
[LEFT | RIGHT | FULL OUTER JOIN table2
ON table1.column_name = table2.column_name

外連接原理:
t1表和t2表做外連接,連接條件為
from t1 left outer join t2 on t1.c1 = t2.c2,
t1表必須做驅(qū)動(dòng)表,t2表做匹配表,記錄的匹配過程如下:

  1. 從t1表中讀取第一條記錄r1,若它的c1值為1
  2. 根據(jù)該值到t2表中查找匹配的記錄,即需要遍歷t2表,從t2表中的第一條記錄開始,若該記錄(r1)的c2列的值等于1,我們就說這兩條記錄能夠匹配上,那么t1的r1和t2的r1組合起來,作為結(jié)果集
    里的一條記錄,否則檢測(cè)t2表中的下一條記錄。
  3. 按照方法2依次將t2表中所有的記錄檢測(cè)一遍,只要匹配就放入結(jié)果集中,若掃描完后,t1的r1記錄在t2表中找不到任何匹配的記錄
    ,t2表中模擬一條null記錄與t1表中r1組合起來,放入結(jié)果集中4. 從t1表中讀取第二條記錄,依次重復(fù)步驟2和3,產(chǎn)生最終的結(jié)果集

t1表和t2表做外連接,連接條件為
from t1 left outer join t2 on t1.c1 = t2.c2,
t1表必須做驅(qū)動(dòng)表,t2表做匹配表,

  1. 外連接的結(jié)果集 = 內(nèi)連接的結(jié)果集 + t1表中匹配不上的記錄和一條null記錄的組合
  2. 外連接的核心可以將驅(qū)動(dòng)表中匹配不上的記錄找回來,即一個(gè)都不能少

1表和t2表做外連接,連接條件為
from t1 right outer join t2 on t1.c1 = t2.c2,t2表必須做驅(qū)動(dòng)表,t1表做匹配表,

  1. 外連接的結(jié)果集 = 內(nèi)連接的結(jié)果集 + t2表中匹配不上的記錄和一條null記錄的組合

t1表和t2表做外連接,連接條件為
from t1 full outer join t2 on t1.c1 = t2.c2,
t2表必須做驅(qū)動(dòng)表,t1表做匹配表,

  1. 外連接的結(jié)果集 = 內(nèi)連接的結(jié)果集 + t2表中匹配不上的記
    錄和一條null記錄的組合 + t1表中匹配不上的記錄和一條
    null記錄的組合
SELECT e.ename employee,m.ename manager
FROM emp e LEFT OUTER JOIN emp m
ON e.mgr = m.empno
列出每個(gè)員工的名字及他們的直接領(lǐng)導(dǎo)的名字(包括最高領(lǐng)導(dǎo))
SELECT m.ename
FROM emp e RIGHT OUTER JOIN emp m
ON e.mgr = m.empno
WHERE e.empno is null
1.列出所有的員工(哪些人不是領(lǐng)導(dǎo))
2.外連接 + where 列名 is null用來解決否定問題,不是,不包含,沒有
SELECT d.dname
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno
AND e.ename = ‘SMITH’
WHERE e.empno is null
1.哪些部門沒有名字為SMITH的員工
2.該語(yǔ)句的執(zhí)行順序?yàn)閷?duì)emp表先用e.ename = ‘SMITH’
進(jìn)行過濾,再將結(jié)果集和dept表做外連接,生成結(jié)果集
后,再用where條件對(duì)該結(jié)果集進(jìn)行過濾,產(chǎn)生最終的
結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容