數(shù)據(jù)庫基礎:SQL join 語句

一:概念

關(guān)系數(shù)據(jù)庫可以在讀取表的時候?qū)Ρ磉M行聯(lián)接甫何。
聯(lián)接本質(zhì)上是以某種方式聯(lián)接兩個獨立的表出吹,并返回一張結(jié)果表。

二:join用法

 tableA        tableB
 id name       id  name
 -- ----       --  ----
 1  Pirate     1   Rutabaga
 2  Monkey     2   Pirate
 3  Ninja      3   Darth Vader
 4  Spaghetti  4   Ninja
  1. Cross join 交叉聯(lián)接
    交叉聯(lián)接通過from字句定義了一個在該字句中所列出關(guān)系上的笛卡爾積:
    第一個關(guān)系中的每個元組與第二個關(guān)系中的所有元組都進行連接辙喂。

    select * from tablea捶牢,tableb;
    select * from tablea cross join tableb;
    
    id |   name    | id |   name   
    ----+-----------+----+----------
     1  | Pirate    | 1  | Rutabaga
     1  | Pirate    | 2  | Pirate
     1  | Pirate    | 3  | Datch
     1  | Pirate    | 4  | Ninja
     2  | Monkey    | 1  | Rutabaga
     2  | Monkey    | 2  | Pirate
     2  | Monkey    | 3  | Datch
     2  | Monkey    | 4  | Ninja
     3  | Ninja     | 1  | Rutabaga
     3  | Ninja     | 2  | Pirate
     3  | Ninja     | 3  | Datch
     3  | Ninja     | 4  | Ninja
     4  | Spaghetti | 1  | Rutabaga
     4  | Spaghetti | 2  | Pirate
     4  | Spaghetti | 3  | Datch
     4  | Spaghetti | 4  | Ninja
    
  2. (Inner可選)join 內(nèi)連接

    tableA         tableB            tableC
    id name        id  name          id  words
    -- ----        --  ----          --  ----
    1  Pirate      1   Rutabaga      1   Rutabaga
    2  Monkey      2   Pirate        2   Pirate
    3  Ninja       3   Darth Vader   3   Darth Vader
    4  Spaghetti   4   Ninja         4   Ninja
    

    2.1 連接條件 natural join
    自然連接運算作用于兩個關(guān)系,并產(chǎn)生一個關(guān)系作為結(jié)果巍耗。
    不同于兩個關(guān)系上的笛卡爾積秋麸,它將第一個關(guān)系的每個元組與第二個關(guān)系的所有元組都進行連接;
    自然連接只考慮那些在兩個關(guān)系模式中都出現(xiàn)的屬性上取值相同的元組對炬太。

    select * from tableA natural join tableC;
     id |   name    |  words   
    ----+-----------+----------
      1 | Pirate    | Rutabaga
      2 | Monkey    | Pirate
      3 | Ninja     | Datch
      4 | Spaghetti | Ninja
    (4 rows)
    

    PS:
    (1)結(jié)果中在兩個關(guān)系中都出現(xiàn)的屬性不會重復列出灸蟆,這樣的屬性只出現(xiàn)一次。
    列出屬性的順序:先是兩個關(guān)系模式中都出現(xiàn)的屬性亲族,然后是只出現(xiàn)在第一個關(guān)系模式中的屬性炒考,最后是只出現(xiàn)在第二個關(guān)系模式中的屬性吓歇。
    (2)自然連接的危險在于如果兩個關(guān)系模式中有多個同名屬性,需要全部匹配票腰。

    select * from tableA natural join tableB;
     id | name 
    ----+------
    (0 rows)
    

    2.2 連接條件 join ... using(A1,A2,A3)
    SQL提供了一種自然連接的構(gòu)造形式城看,這樣用戶來指定需要哪些列相等,而不需要同名屬性的取值全部相等杏慰。

    postgres=# select * from tableA join tableB using(id);
     id |   name    |   name   
    ----+-----------+----------
      1 | Pirate    | Rutabaga
      2 | Monkey    | Pirate
      3 | Ninja     | Datch
      4 | Spaghetti | Ninja
    (4 rows)
    

    PS: join ... using(A1,A2,A3) 需要給定一個屬性名列表测柠,其兩個輸入中都必須有指定名稱的屬性玖喘。
    2.3 連接條件 join ... on<predicate>
    SQL支持另一種形式的連接條件:join ... on<predicate>店煞,相比 join ... using(A1,A2,A3) 可以指定任意的連接條件,更為靈活掉盅。

    select * from tableA join tableB on tableA.id=tableB.id;
     id |   name    | id |   name   
    ----+-----------+----+----------
      1 | Pirate    |  1 | Rutabaga
      2 | Monkey    |  2 | Pirate
      3 | Ninja     |  3 | Datch
      4 | Spaghetti |  4 | Ninja
    (4 rows)
    
    select * from tableA join tableB on tableA.id<tableB.id;
     id |  name  | id |  name  
    ----+--------+----+--------
      1 | Pirate |  2 | Pirate
      1 | Pirate |  3 | Datch
      1 | Pirate |  4 | Ninja
      2 | Monkey |  3 | Datch
      2 | Monkey |  4 | Ninja
      3 | Ninja  |  4 | Ninja
    (6 rows)
    

    PS: join ... on<predicate> 的結(jié)果中會重復出現(xiàn)兩個關(guān)系中相同的屬性朝扼。

  3. outer join 外連接
    在內(nèi)連接中赃阀,參與連接的任何一個關(guān)系或者兩個關(guān)系中的某些元組可能會丟失。
    例如:同名屬性中擎颖,有一個關(guān)系的屬性值為null榛斯。
    外連接運算與內(nèi)連接相似,但是會在結(jié)果中創(chuàng)建包含空值元組的方式搂捧,保留了那些在內(nèi)連接中丟失的元組驮俗。
    外連接包含三種形式:

    • 左外連接left outer join,只保留出現(xiàn)在左邊的關(guān)系中的元組;
    • 右外連接right outer join允跑,只保留出現(xiàn)在右邊的關(guān)系中的元組王凑;
    • 全外連接full outer join,保留出現(xiàn)在兩個關(guān)系中的元組聋丝;
     tableA         tableB          
     id name        id  name        
     -- ----        --  ----          
     1  Pirate      1   Rutabaga      
     3  null        2   null        
    
    select * from tableA left outer join tableB using(id);
     id |  name  |   name   
    ----+--------+----------
      1 | Pirate | Rutabaga
      3 |        | 
    (2 rows)
    select * from tableA right outer join tableB using(id);
     id |  name  |   name   
    ----+--------+----------
      1 | Pirate | Rutabaga
      2 |        | 
    (2 rows)
    select * from tableA full outer join tableB using(id);
     id |  name  |   name   
    ----+--------+----------
      1 | Pirate | Rutabaga
      3 |        | 
      2 |        | 
    (3 rows)
    

    注意: outer join 外連接也可以像內(nèi)連接那樣與任意的連接條件(自然連接索烹、using條件或on條件)進行組合。

三:總結(jié)

  1. 連接類型(內(nèi)/外連接)可以和連接條件自由組合弱睦。


  2. 注意不同數(shù)據(jù)庫的實現(xiàn)百姓。mysql

    select * from a natural join b ; 相同屬性名,相同屬性值
    select * from a cross JOIN b ; select * from a JOIN b ;select * from a FULL JOIN b ;  交叉連接效果
    
    select * from a  JOIN b + 連接條件on/using; 
    select * from a LEFT/RIGHT  JOIN b + 連接條件on/using; 
    
  3. 韋恩圖解釋 SQL join 語句


[2016.10.12]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末每篷,一起剝皮案震驚了整個濱河市瓣戚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焦读,老刑警劉巖子库,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矗晃,居然都是意外死亡仑嗅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仓技,“玉大人鸵贬,你說我怎么就攤上這事〔蹦恚” “怎么了阔逼?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長地沮。 經(jīng)常有香客問我嗜浮,道長,這世上最難降的妖魔是什么摩疑? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任危融,我火速辦了婚禮,結(jié)果婚禮上雷袋,老公的妹妹穿的比我還像新娘吉殃。我一直安慰自己,他們只是感情好楷怒,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布蛋勺。 她就那樣靜靜地躺著,像睡著了一般率寡。 火紅的嫁衣襯著肌膚如雪迫卢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天冶共,我揣著相機與錄音,去河邊找鬼每界。 笑死捅僵,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的眨层。 我是一名探鬼主播庙楚,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼趴樱!你這毒婦竟也來了馒闷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叁征,失蹤者是張志新(化名)和其女友劉穎纳账,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捺疼,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡疏虫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卧秘。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呢袱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翅敌,到底是詐尸還是另有隱情羞福,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布蚯涮,位于F島的核電站坯临,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏恋昼。R本人自食惡果不足惜看靠,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望液肌。 院中可真熱鬧挟炬,春花似錦、人聲如沸嗦哆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽老速。三九已至粥喜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間橘券,已是汗流浹背额湘。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旁舰,地道東北人锋华。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像箭窜,于是被迫代替她去往敵國和親毯焕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

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