亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

SQL JOIN 簡(jiǎn)單介紹

系統(tǒng) 1661 0

前言

  本文還是秉持之前一貫的寫(xiě)作風(fēng)格,以簡(jiǎn)單易懂的示例幫助大家了解各種join的區(qū)別。

 為什么需要join

  為什么需要join?join中文意思為連接,連接意味著關(guān)聯(lián)即將一個(gè)表和多個(gè)表之間關(guān)聯(lián)起來(lái)。在處理數(shù)據(jù)庫(kù)表的時(shí)候,我們經(jīng)常會(huì)發(fā)現(xiàn),需要從多個(gè)表中獲取信息,將多個(gè)表的多個(gè)字段數(shù)據(jù)組裝起來(lái)再返回給調(diào)用者。所以join的前提是這些表之間必須有關(guān)聯(lián)字段。

 join的分類(lèi)

SQL JOIN 簡(jiǎn)單介紹

  join分為兩種,inner join和outer join,其中outer join分為三種,left outer join, right outer join, full outer join,另外left outer join又簡(jiǎn)稱為left join即大家所熟知的左連接。

 各種join的區(qū)別

  在介紹各種join的區(qū)別之前,我們先來(lái)看一個(gè)簡(jiǎn)單的示例:

  場(chǎng)景描述:

  互聯(lián)網(wǎng)時(shí)代,大家都喜歡在網(wǎng)上購(gòu)物,尤其是淘寶和京東,所以我們選擇的場(chǎng)景也是大家熟悉的網(wǎng)上購(gòu)物。這是一個(gè)關(guān)于一個(gè)人和他在商城買(mǎi)了什么商品的一個(gè)故事;

  針對(duì)上述需求,我們建立了兩張表,tb_person和tb_order,其中tb_person是關(guān)于這個(gè)人的描述,tb_order是關(guān)于他購(gòu)買(mǎi)的商品的一個(gè)描述。

  我們的表結(jié)構(gòu)很簡(jiǎn)單,tb_person只需要知道這個(gè)人是誰(shuí)就可以了,所以只有三個(gè)字段id,firstname(名)和lastname(姓),同樣tb_order也很簡(jiǎn)單,我們只要知道誰(shuí)買(mǎi)了什么商品,所以只需要3個(gè)字段,分別是oid, oname(商品名稱), pid(購(gòu)買(mǎi)者編號(hào))。

  tb_person:

      +-----------+-------------+------+-----+---------+----------------+

|?Field?????|?Type????????|?Null?|?Key?|?Default?|?Extra??????????|

+-----------+-------------+------+-----+---------+----------------+

|?pid???????|?int(11)?????|?NO???|?PRI?|?NULL????|?auto_in
      
        c
      
      rement?|

|?firstname?|?var
      
        c
      
      har(50)?|?YES??|?????|?NULL????|????????????????|

|?lastname??|?var
      
        c
      
      har(50)?|?YES??|?????|?NULL????|????????????????|

+-----------+-------------+------+-----+---------+----------------+
    

  tb_order:

      +-------+-------------+------+-----+---------+----------------+

|?Field?|?Type????????|?Null?|?Key?|?Default?|?Extra??????????|

+-------+-------------+------+-----+---------+----------------+

|?oid???|?int(11)?????|?NO???|?PRI?|?NULL????|?auto_in
      
        c
      
      rement?|

|?oname?|?var
      
        c
      
      har(50)?|?YES??|?????|?NULL????|????????????????|

|?pid???|?int(11)?????|?YES??|?????|?NULL????|????????????????|

+-------+-------------+------+-----+---------+----------------+
    

  接下來(lái),我們向上述兩張表中寫(xiě)入一些示例數(shù)據(jù):

  data in tb_person:

      +-----+-----------+----------+

|?pid?|?firstname?|?lastname?|

+-----+-----------+----------+

|???1?|?andy??????|?
      
        c
      
      hen?????|

|???2?|?irri??????|?wan??????|

|???3?|?abby??????|?sun??????|

+-----+-----------+----------+
    

  tb_person表中有三位人員,分別是andy Chen, irri Wan, abby Sun;

  data in tb_order:

      +-----+----------+------+

|?oid?|?oname????|?pid??|

+-----+----------+------+

|???1?|?book?????|????1?|

|???2?|?phone????|????1?|

|???3?|?
      
        c
      
      omputer?|????4?|

+-----+----------+------+
    

  tb_order表中記錄了3條數(shù)據(jù),人員編號(hào)為1也就是andy Chen買(mǎi)了兩件商品分別是book和phone,另外還有一個(gè)人員編號(hào)為4的人買(mǎi)了一件商品 c omputer。關(guān)于這個(gè)大家可能會(huì)產(chǎn)生疑問(wèn),為什么tb_person表中沒(méi)有人員編號(hào)為4的人呢?這里我們姑且認(rèn)為由于注冊(cè)用戶較多,我們采用了用戶分表策略,所以人員編號(hào)為4的用戶可能在另外一張人員表中。

  從之前的描述我們知道,表與表之間如果要join則必須要有關(guān)聯(lián)的字段,上述示例我們看到這個(gè)關(guān)聯(lián)的字段就是pid。

  根據(jù)tb_person和tb_order兩張表,我們可以看到有三種情形:

  1. person表中的人購(gòu)買(mǎi)了商品,也就是order表中有關(guān)于該用戶的商品購(gòu)買(mǎi)記錄,我們可以從該表中查詢到該用戶買(mǎi)了哪些商品,如andy Chen購(gòu)買(mǎi)了book和phone兩種商品,即pid在tb_person和tb_order兩種表中都存在;

  2. person表中的人未購(gòu)買(mǎi)商品,如irri Wan和abby Sun兩位用戶并未購(gòu)買(mǎi)任何商品,即pid只存在于tb_person表;

  3. order表中購(gòu)買(mǎi)商品的用戶在person表中找不到記錄,如pid為4的用戶購(gòu)買(mǎi)了一臺(tái)computer但在tb_person表中沒(méi)有該用戶的記錄,即pid只存在于tb_order表;

  理解上述三種情形對(duì)于我們理解join有非常大的幫助,接下來(lái)我們將具體的分析每種join的區(qū)別:

  INNER JOIN

  所謂inner join的意思就是我們前面提到的情形1,pid必須在tb_person和tb_order兩張表中同時(shí)存在;

      MariaDB?[demo]>?SELECT?p.pid,?p.firstname,?o.oname

????->?FROM?tb_person?p

????->?INNER?JOIN?tb_order?o

????->?ON?p.pid=o.pid;
    
      +-----+-----------+-------+

|?pid?|?firstname?|?oname?|

+-----+-----------+-------+

|???1?|?andy??????|?book??|

|???1?|?andy??????|?phone?|

+-----+-----------+-------+
    

  LEFT JOIN

  tb_person LEFT JOIN tb_order的意思是上述情形1,情形2的并集。LEFT JOIN的結(jié)果集不僅包含INNER JOIN的結(jié)果,而且還包含所有tb_person中沒(méi)有購(gòu)買(mǎi)任何商品的用戶集。

      MariaDB?[demo]>?SELECT?p.pid,?p.firstname,?o.oname

????->?FROM?tb_person?p

????->?LEFT?JOIN?tb_order?o

????->?ON?p.pid=o.pid;
    
      +-----+-----------+-------+

|?pid?|?firstname?|?oname?|

+-----+-----------+-------+

|???1?|?andy??????|?book??|

|???1?|?andy??????|?phone?|

|???2?|?irri??????|?NULL??|

|???3?|?abby??????|?NULL??|

+-----+-----------+-------+
    

  RIGHT JOIN

  tb_person RIGHT JOIN tb_order的意思是上述情形1和情形3的并集。RIGHT JOIN的結(jié)果集不僅包含INNER JOIN的結(jié)果,而且還包含所有tb_order中所有已經(jīng)購(gòu)買(mǎi)商品的用戶但該用戶記錄不存在于tb_person表。

      MariaDB?[demo]>?SELECT?p.pid,?p.firstname,?o.oname

????->?FROM?tb_person?p

????->?RIGHT?JOIN?tb_order?o

????->?ON?p.pid=o.pid;
    
      +------+-----------+----------+

|?pid??|?firstname?|?oname????|

+------+-----------+----------+

|????1?|?andy??????|?book?????|

|????1?|?andy??????|?phone????|

|?NULL?|?NULL??????|?computer?|

+------+-----------+----------+
    

  FULL JOIN

  故名思議,F(xiàn)ULL JOIN就是上述情形1,2,3的并集了,但是my sql 數(shù)據(jù)庫(kù)不支持full join查詢,所以我們只能LEFT JOIN union RIGHT JOIN,才能得到FULL JOIN的結(jié)果。

      MariaDB?[demo]>?SELECT?p.pid,?p.firstname,?o.oname

????->?FROM?tb_person?p

????->?LEFT?JOIN?tb_order?o

????->?ON?p.pid=o.pid

????->?UNION

????->?SELECT?p.pid,?p.firstname,?o.oname

????->?FROM?tb_person?p

????->?RIGHT?JOIN?tb_order?o

????->?ON?p.pid=o.pid;
    
      +------+-----------+----------+

|?pid??|?firstname?|?oname????|

+------+-----------+----------+

|????1?|?andy??????|?book?????|

|????1?|?andy??????|?phone????|

|????2?|?irri??????|?NULL?????|

|????3?|?abby??????|?NULL?????|

|?NULL?|?NULL??????|?computer?|

+------+-----------+----------+
    

  注:我們上述的sql語(yǔ)句全部基于mysql數(shù)據(jù)庫(kù)執(zhí)行。

 總結(jié)

  本文主要描述了 sql ?join的分類(lèi)以及各種join的區(qū)別,通過(guò)簡(jiǎn)單的示例,讓大家更清晰的去了解他們。至于什么時(shí)候使用join要視具體的情況而定,根據(jù)不同的需求采用不同的策略。

  非常感謝大家的熱心回復(fù),可能有些問(wèn)題的探討超出了本文的范疇,但是非常樂(lè)意大家提出問(wèn)題,然后大家一起去探索去發(fā)現(xiàn)。

 引用

  NULL

 附件

  demo.sql文件

      
        c
      
      reate?database?demo;

use?demo;




      
        c
      
      reate?table?tb_person?(

????pid?int(11)?auto_in
      
        c
      
      rement,

????firstname?var
      
        c
      
      har(50),

????lastname?var
      
        c
      
      har(50),

????primary?key(pid)

);




      
        c
      
      reate?table?tb_order?(

????oid?int(11)?auto_in
      
        c
      
      rement,

????oname?var
      
        c
      
      har(50),

????pid?int(11),

????primary?key(oid)

);



insert?into?tb_person(firstname,?lastname)?values('andy','
      
        c
      
      hen');

insert?into?tb_person(firstname,?lastname)?values('irri','wan');

insert?into?tb_person(firstname,?lastname)?values('abby','sun');





insert?into?tb_order(oname,?pid)?values('book',?1);

insert?into?tb_order(oname,?pid)?values('phone',?1);

insert?into?tb_order(oname,?pid)?values('computer',?4);
    
?
?

SQL JOIN 簡(jiǎn)單介紹


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 毛片女女女女女女女女女 | 五月天狠狠干 | 日日噜噜夜夜狠狠久久丁香 | 日本激情啪啪 | 手机看片福利日韩国产 | 国产亚洲自拍一区 | 日本亚洲精品成人 | 国产精品福利视频主播真会玩 | 国产美女mm131爽爽爽免费 | 国产一级黄色录像 | 99在线视频观看 | 久夜色精品国产一区二区三区 | 亚洲免费视频在线 | 欧美成人午夜免费完成 | 九九视频免费观看 | 亚洲成在人线影视天堂网 | 国产亚洲美女精品久久久久狼 | 清纯唯美亚洲综合日韩第 | 欧美一区二区三区黄色 | 亚洲综合在线观看视频 | 男女生性毛片免费观看 | 日本特黄a级高清免费大片18 | 日日摸夜夜添夜夜添欧美毛片 | 伊人涩 | 国产精品2020在线看亚瑟 | 亚洲欧美久久精品 | 成人免费视频在线观看 | 中文字幕 亚洲精品 第1页 | 亚洲热热久久九九精品 | 成人欧美一区二区三区视频 | 成人毛片高清视频观看 | 久草首页在线观看 | 亚洲九九精品 | 99精品一区二区三区 | 欧美成人性色xxxx视频 | 亚洲精品亚洲人成在线 | 蜜桃久久 | 欧美日韩中文字幕 | 日日摸夜夜嗷嗷叫日日拍 | 日日夜夜免费精品 | 婷婷视频在线观看 |