最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中的 inner join 和 left join的區(qū)別解析(小結(jié)果集驅(qū)動大結(jié)果集)

 更新時(shí)間:2023年05月06日 10:51:57   作者:@大吉  
這篇文章主要介紹了MySQL中的 inner join 和 left join的區(qū)別解析,本文通過場景描述給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

場景描述

以一個(gè)場景為例:

單據(jù)A:下游子表 (數(shù)據(jù)量級小)
單據(jù)B:下游主表(數(shù)據(jù)量級?。?br />單據(jù)C:中游子表(數(shù)據(jù)量級?。?br />單據(jù)D:中游主表(數(shù)據(jù)量級小)
單據(jù)E:上游子表(數(shù)據(jù)量級?。?br />單據(jù)F:上游主表(比其他表數(shù)據(jù)量級大)

需求:將單據(jù)F的某個(gè)字段,刷到單據(jù)A的某個(gè)字段上面。從A到F,都可以通過id連接索引的形式,來關(guān)聯(lián)。但是A到F的連接順序必須是從A到F順序連接。比如:

這幾個(gè)表的連接可以用下面的例子演示:

a join b on a.id = b.id
b join c on b.id = c.mainId
c join d on c.id = d.tableId
d join e on d.id = e.tid
e join f on e.tid = f.code

inner join 和 left join 的區(qū)別

我們寫update語句的時(shí)候,肯定是想要用join連表的。但是到底是使用inner join;還是left join比較好呢?

  • left join:

select a.*,b.* from a left join b on a.id = b.id , 這兩個(gè)表連接,根據(jù)后面的on條件,如果b表里面的b.id不符合 a.id = b.id ,那么a表里面的所有數(shù)據(jù)列都會給展示出來。然后b表沒有這種數(shù)據(jù),所以sql里面的 b.* 會被全部填充成null

  • inner join:

select a.*,b.* from a inner join b on a.id = b.id , 這兩個(gè)表連接,根據(jù)后面on條件,如果b表里面的b.id不符合 a.id = b.id ,那么a表里面的部分?jǐn)?shù)據(jù)列(不符合a.id = b.id條件的)就不會展示。

根據(jù)上面的定義,left join常用于select 語句;這是為了防止a表會少一些匹配記錄,為了能展示全a表,所以使用left join。

如下圖所示:

索引角度理解小結(jié)果集驅(qū)動大結(jié)果集

不管是 left join 和 inner join,都要注意小結(jié)果集驅(qū)動大結(jié)果集。a表 join b表的時(shí)候,

還是看之前例子的SQL:

select a.*,b.* from a left join b on a.id = b.id

假設(shè)a表數(shù)量級是100萬條,b表數(shù)量級是100條。我這樣連接,就是大表驅(qū)動小表;直接看查找次數(shù):

在用后面on條件連接兩個(gè)表的時(shí)候,首先要走B+樹索引進(jìn)行匹配;拿a表這100w的數(shù)量級,逐條對比 -> B+樹 -> 匹配到 b表的記錄。假設(shè)B+樹查找b表的100條要用2次查找,那么最終查找次數(shù)就是: 100萬 * 2 次

如果是小表驅(qū)動大表:

select a.*,b.* from b left join a on a.id = b.id

那么就會拿b表這100條,逐條對比 -> B+樹 -> 匹配到 a表的記錄。假設(shè)B+樹查找a表的100w條要用3次查找,那么最終查找次數(shù)就是: 100 * 3 次

從索引匹配的角度講,小結(jié)果集驅(qū)動大結(jié)果集的效率優(yōu)化了不是一點(diǎn)半點(diǎn)。我們要有意識地讓小表在左邊,大表在右邊

但是如果你用的是inner join,MySQL內(nèi)部會做優(yōu)化,自動讓小表在前大表在后。也就是說你怎么寫,效率都是一樣的。但是left join卻不能自動優(yōu)化,這點(diǎn)需要注意!

update語句常用 inner join而不是left join

舉例如下SQL:

(任務(wù)目標(biāo):用f 表字段更新a表字段)

update a 
inner join b on a.id = b.id
inner join c on b.id = c.mainId
inner join d on c.id = d.tableId
inner join e on d.id = e.tid
inner join f on e.tid = f.code
set a.Demand_orgid = f.req_org_id
where xxx = xxx;

update 原則上 都得用inner join。

看上面的SQL,假設(shè)你全部都用的left join做關(guān)聯(lián),由于你最終update 的是 a的字段;假設(shè)a表在left join的過程中,因?yàn)槟硞€(gè)點(diǎn)匹配不到f表,那么用f 表字段更新a表字段 這一個(gè)過程中,一旦有任意一個(gè)環(huán)節(jié)匹配不到,那么f 表的字段全都會用null填充。最終,a表匹配不到f表的數(shù)據(jù),都會被更新成null !

但是如果你用inner join,用f 表字段更新a表字段 這一個(gè)過程中,一旦有任意一個(gè)環(huán)節(jié)匹配不到,那么a表匹配不到 f 表的所有數(shù)據(jù)就不會顯示,也就是說不會更新。

你想想,你都匹配不到數(shù)據(jù)列。你還更新啥,難道更新null嗎。基于上面的原因,inner join 其實(shí)就滿足需求了

況且!left join 要考慮這幾張表的大小關(guān)系,誰大誰小,小結(jié)果集驅(qū)動大結(jié)果集。但是inner join 就完全不用考慮此問題,因?yàn)?strong>inner join MySQL內(nèi)部會做優(yōu)化,自動讓小表在前大表在后。

到此這篇關(guān)于MySQL中的 inner join 和 left join的區(qū)別的文章就介紹到這了,更多相關(guān)mysql inner join 和 left join區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 監(jiān)控MySQL主從狀態(tài)的shell腳本

    監(jiān)控MySQL主從狀態(tài)的shell腳本

    這篇文章主要分享了監(jiān)控MySQL主從狀態(tài)的shell腳本,幫助大家更好的監(jiān)控mysql數(shù)據(jù)庫,保持穩(wěn)定性,感興趣的朋友可以了解下
    2020-12-12
  • MySQL5.0存儲過程教程

    MySQL5.0存儲過程教程

    Introduction 簡介 MySQL 5.0 新特性教程是為需要了解5.0版本新特性的MySQL老用戶而寫的。簡單的來說是介紹了“存儲過程、觸發(fā)器、視圖、信息架構(gòu)視圖”,在此感謝譯者陳朋奕的努力.
    2008-04-04
  • mysql 設(shè)置默認(rèn)的時(shí)間值

    mysql 設(shè)置默認(rèn)的時(shí)間值

    由于MySQL目前字段的默認(rèn)值不支持函數(shù)
    2009-05-05
  • MySql安裝步驟圖文教程及中文亂碼的解決方案

    MySql安裝步驟圖文教程及中文亂碼的解決方案

    這篇文章主要介紹了MySql安裝步驟圖文教程及中文亂碼的解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • MySQL數(shù)據(jù)庫高級數(shù)據(jù)操作之新增數(shù)據(jù)

    MySQL數(shù)據(jù)庫高級數(shù)據(jù)操作之新增數(shù)據(jù)

    這篇文章主要介紹了MySQL數(shù)據(jù)庫高級數(shù)據(jù)操作之新增數(shù)據(jù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • MySQL新手入門進(jìn)階語句匯總

    MySQL新手入門進(jìn)階語句匯總

    這篇文章主要給大家介紹了關(guān)于MySQL新手入門進(jìn)階語句的相關(guān)資料,總結(jié)分析了MySQL數(shù)據(jù)庫常用的查詢、條件查詢、排序、連接查詢、子查詢等相關(guān)操作技巧,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • MySQL InnoDB row_id邊界溢出驗(yàn)證的方法步驟

    MySQL InnoDB row_id邊界溢出驗(yàn)證的方法步驟

    這篇文章主要給大家介紹了關(guān)于MySQL InnoDB row_id邊界溢出驗(yàn)證的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用MySQL InnoDB具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • mysql root密碼的重設(shè)方法(親測可用)

    mysql root密碼的重設(shè)方法(親測可用)

    這篇文章主要介紹了如何重設(shè)mysql root密碼,需要的朋友可以參考下
    2014-02-02
  • MSSQL產(chǎn)生死鎖的根本原因及解決方法

    MSSQL產(chǎn)生死鎖的根本原因及解決方法

    死鎖是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去.此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等的進(jìn)程稱為死鎖進(jìn)程
    2016-04-04
  • MySQL中使用表別名與字段別名的基本教程

    MySQL中使用表別名與字段別名的基本教程

    這篇文章主要介紹了MySQL中使用表別名與字段別名的基本教程,利用SELECT語句和AS子句進(jìn)行取別名的操作,需要的朋友可以參考下
    2015-12-12

最新評論

教育| 泽州县| 广安市| 吴堡县| 济南市| 河源市| 图片| 磴口县| 凤翔县| 麦盖提县| 高安市| 儋州市| 江津市| 象州县| 荥经县| 大新县| 岳阳县| 闸北区| 广灵县| 德阳市| 东乌| 大田县| 宝山区| 芜湖市| 呼伦贝尔市| 阿瓦提县| 杂多县| 扶风县| 望城县| 灵石县| 阿巴嘎旗| 台中市| 怀安县| 山阴县| 泸水县| 新蔡县| 齐河县| 六安市| 平罗县| 昆明市| 天台县|