多表連接

一、什么是連接

連接是在多個表之間通過一定的連接條件,使表之間發(fā)生關(guān)聯(lián)登淘,進而能從多個表之間獲得數(shù)據(jù)。

語法:

SELECT  table1.column, table2.column 
FROM  table1, table2 
WHERE  table1.column1 = table2.column2;
  • 在WHERE子句中書寫連接條件吊趾。
  • 如果在多個表中出現(xiàn)相同的列名宛裕,則需要使用表名作為來自該表的列名的前綴。
  • N個表相連時论泛,至少需要N-1個連接條件
二、連接的類型
  • 按照連接條件分:

等值連接
非等值連接

  • 按其他連接方法分:

外部連接
內(nèi)部連接

三蛹屿、多表連接寫法

多表連接包含多種寫法屁奏,在這里主要介紹:

  • Oracle寫法:oracle公司提供的寫法,絕大多數(shù)符合SQL標準错负,其他關(guān)系型數(shù)據(jù)也適用坟瓢。
  • ANNSI 99寫法:ANSI標準提供的寫法,所有關(guān)系型數(shù)據(jù)必須支持犹撒。
四折联、笛卡爾積
  • 笛卡爾積是:
    第一個表中的所有行和第二個表中的所有行都發(fā)生連接
  • 笛卡爾積在下列情況卡產(chǎn)生
    1.連接條件被省略
    2.連接條件是無效的
  • 為了避免笛卡爾積的產(chǎn)生,通常需要在WHERE子句中包含一個有效的連接條件识颊。
  • 笛卡爾積結(jié)果
    簡單描述:
    表1中有14行數(shù)據(jù)诚镰,表2中有4行數(shù)據(jù),笛卡爾積結(jié)果為56行數(shù)據(jù)
五祥款、使用AND 運算符增加其他的查詢條件
  • 在WHERE子句的連接條件后添加AND條件
六清笨、限制歧義列名
  • 在用到多個表時可以使用表名作為前綴來限定列。
  • 通過使用表前綴可以提高性能刃跛。
  • 通過使用列的別名可以區(qū)分來自不同表但是名字相同的列抠艾。
七、使用表的別名
  • 通過使用表的別名來簡化查詢語句
2019-02-14_163746.png
八桨昙、多余兩個表的連接
  • 多個表連接和兩個表的連接一樣检号,在構(gòu)造SQL語句時,需要多考慮一個表之間的關(guān)聯(lián)條件蛙酪。
九齐苛、多表連接的寫法
  • 分析要查詢的列都來自哪個表,構(gòu)成FROM子句
  • 分析這些表之間的關(guān)聯(lián)關(guān)系滤否,如果表之間沒有直接的關(guān)聯(lián)關(guān)系脸狸,而是通過另一個中間表關(guān)聯(lián),則也要在FROM子句中補充中間關(guān)聯(lián)表藐俺。
  • 接下來在WHERE子句中補充表之間的關(guān)聯(lián)關(guān)系炊甲,通常N個表,至少要有N-1個關(guān)聯(lián)關(guān)系欲芹。
  • 分析是否還有其他限制條件卿啡,補充到WHERE子句的表關(guān)聯(lián)關(guān)系之后,作為限定條件菱父。
  • 根據(jù)用戶想要顯示的信息颈娜,補充SELECT子句剑逃。
  • 分析是否有排序要求,如果排序要求中還涉及到其他表官辽,則也要進行第2步補充排序字段所需要的表蛹磺,并且添加表之間的關(guān)聯(lián)關(guān)系。
十同仆、外部連接
  • 在多表連接時萤捆,可以使用外部連接來查看哪些行,按照連接條件沒有被匹配上俗批。
  • 外部連接的符號是(+)俗或,語法包括:

左外連接:

SELECT  table1.column, table2.column 
FROM   table1, table2 
WHERE  table1.column(+) = table2.column;

右外連接:

SELECT  table1.column, table2.column 
FROM   table1, table2 
WHERE  table1.column = table2.column(+);
  • 外部連接就好像是為符號(+)所在邊的表增加一個“萬能”的行,這個行全部由NULL組成岁忘。他可以和另一邊的表中所有不滿足連接條件的進行連接辛慰。由于這個“萬能”行的各列全是空值,因此在連接結(jié)果中干像,來自“萬能”行屬性值全部為空值帅腌。
十一、自身連接
  • 自身連接蝠筑,也叫自連接狞膘,是一個表通過某種條件和本身進行連接的一種方式,就如同多個表連接一樣什乙。
  • 例如:
SELECT  worker.ename || ' leader is ' || manager.ename 
FROM   emp  worker,  emp  manager 
WHERE  worker.mgr  =  manager.empno; 
十二挽封、SQL:1999語法的連接
  • ANSI SQL:1999標準的連接語法
    oracle除了上述自己的連接語法外,同時支持美國國家標準協(xié)會(ANSI)的SQL:1999標準的連接語法臣镣。
SELECT  table1.column, table2.column 
FROM  table1 
[CROSS JOIN table2] | 
[NATURAL JOIN table2] | 
[JOIN table2 USING (column_name)] | 
[JOIN table2  
ON(table1.column_name = table2.column_name)] | 
[LEFT|RIGHT|FULL OUTER JOIN table2  
ON (table1.column_name = table2.column_name)];
  • 交叉連接
    交叉連接會產(chǎn)生兩個表的交叉乘積辅愿,和兩個表之間的笛卡爾積是一樣的。
    使用CROSS JOIN 子句完成忆某。
SELECT emp.empno,emp.ename,emp.sal,emp.deptno,dept.loc  
FROM emp  
CROSS JOIN dept;
  • 自然連接
    自然連接是對兩個表之間相同名字和數(shù)據(jù)類型的列進行等值的連接点待。
    如果兩個表之間相同名稱的列的數(shù)據(jù)類型不同,則會產(chǎn)生錯誤弃舒。
    使用NATURAL JOIN子句完成癞埠。
SELECT  empno,ename,sal,deptno,loc  
FROM    emp  
NATURAL JOIN   dept;
  • USING子句
    自然連接是使用所有名稱和數(shù)據(jù)類型相匹配的列作為連接條件,而USING子句可以指定用某個或者某幾個相同名稱和數(shù)據(jù)類型的列作為連接條件聋呢。
SELECT e.ename,e.ename,e.sal,deptno,d.loc  
FROM emp e JOIN dept d USING (deptno)  
WHERE deptno = 20;

使用USING子句創(chuàng)建連接時苗踪,應(yīng)注意以下幾點:

  • 如果有若干個列名稱相同但數(shù)據(jù)類型不同,自然連接子句可以使用USING子句來替換削锰,以指定產(chǎn)生等值連接的列通铲。
  • 如果有多于一個列都匹配的情況,使用USING子句只能指定其中的一列器贩。
  • USING子句中用到的列不能使用表名和別名作為前綴颅夺。
  • NATURAL JOIN子句和USING子句是相互排斥的朋截,不能同時使用。
  • ON子句
    自然連接條件基本上是具有相同列名的表之間的等值連接吧黄。
    如果要指明任意連接條件部服,或要指明要連接的列,則可以使用ON子句稚字。
    用ON將連接條件和其他檢索條件分隔開饲宿,其他檢索條件寫在WHERE子句。
    ON子句可以提高代碼的可讀性胆描。
SELECT   e.empno, e.ename, e.deptno, d.deptno, d.loc  
FROM     emp e  
JOIN   dept d  
ON    (e.deptno = d.deptno);
  • 外連接

左外連接
左外連接以FROM子句中左邊表為基表,該表所有行數(shù)據(jù)按照連接條件無論是否與右邊表能匹配上仗阅,都會被顯示出來

SELECT e.ename,e.deptno,d.loc  
FROM emp e  
LEFT OUTER JOIN dept d  
ON (e.deptno = d.deptno);

右外連接
右外連接以FROM子句中右邊表為基表昌讲,該表所有行數(shù)據(jù)按照連接條件無論是否與左邊表能匹配上,都會被顯示出來

SELECT e.ename,e.deptno,d.loc  
FROM emp e  
RIGHT OUTER JOIN dept d  
ON (e.deptno = d.deptno);

全外連接
全外連接返回兩個表等值連接結(jié)果减噪,以及兩個表中所有等值連接失敗的結(jié)果

SELECT   e.ename,e.deptno,d.loc  
FROM     emp e  
FULL    OUTER JOIN dept d  
ON       (e.deptno = d.deptno);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末短绸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子筹裕,更是在濱河造成了極大的恐慌醋闭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朝卒,死亡現(xiàn)場離奇詭異证逻,居然都是意外死亡,警方通過查閱死者的電腦和手機抗斤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門囚企,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瑞眼,你說我怎么就攤上這事龙宏。” “怎么了伤疙?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵银酗,是天一觀的道長。 經(jīng)常有香客問我徒像,道長黍特,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任厨姚,我火速辦了婚禮衅澈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谬墙。我一直安慰自己今布,他們只是感情好经备,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著部默,像睡著了一般侵蒙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上傅蹂,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天纷闺,我揣著相機與錄音,去河邊找鬼份蝴。 笑死犁功,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的婚夫。 我是一名探鬼主播浸卦,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼案糙!你這毒婦竟也來了限嫌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤时捌,失蹤者是張志新(化名)和其女友劉穎怒医,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奢讨,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡稚叹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了禽笑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片入录。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖佳镜,靈堂內(nèi)的尸體忽然破棺而出僚稿,到底是詐尸還是另有隱情,我是刑警寧澤蟀伸,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布蚀同,位于F島的核電站,受9級特大地震影響啊掏,放射性物質(zhì)發(fā)生泄漏蠢络。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一迟蜜、第九天 我趴在偏房一處隱蔽的房頂上張望刹孔。 院中可真熱鬧,春花似錦娜睛、人聲如沸髓霞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽结序。三九已至,卻和暖如春徐鹤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邀层。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工返敬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寥院,地道東北人救赐。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓只磷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钮追。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 多表連接初步 引出 ?思考如下問題阿迈? –寫一條查詢語句元媚,查詢員工姓名苗沧、部門名稱刊棕、工作地點待逞? 寫一個查詢顯示員工姓名...
    wqjcarnation閱讀 2,876評論 0 7
  • 多表連接初步 引出 ?思考如下問題甥角? –寫一條查詢語句识樱,查詢員工姓名嗤无、部門名稱怜庸、工作地點当犯? 寫一個查詢顯示員工姓名...
    C_cole閱讀 649評論 0 0
  • 第一章SQL 1.Oracle數(shù)據(jù)庫基礎(chǔ) (1).開始>運行>輸入:sqlpusw/nolog>確定sqlplus...
    蛋炒飯_By閱讀 299評論 0 0
  • 5.多表查詢 多表查詢 目的:從多張表獲取數(shù)據(jù) 前提:進行連接的多張表中有共同的列 等連接 通過兩個表具有相同意義...
    喬震閱讀 1,235評論 0 0
  • 連接MYSQL: 1、例1:連接到本機上的MYSQL 找到mysql的安裝目錄割疾,一般可以直接鍵入命令mysql -...
    AlbenXie閱讀 3,941評論 0 1