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

Mysql表連接的執(zhí)行流程詳解

 更新時間:2022年08月25日 11:37:14   作者:Balloon???????  
這篇文章主要介紹了Mysql表連接的執(zhí)行流程詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助

1. 前言

對于連接操作,驅(qū)動表和被驅(qū)動表的關(guān)聯(lián)條件我們放在on后面,如果額外增加對驅(qū)動表和被驅(qū)動表的過濾條件,放到on或者where后面都不會報錯,但是得到的結(jié)果集卻是不一樣的???

1.1 mysql連接的原理

眾所周知,mysql是基于嵌套循環(huán)連接(Nested-Loop Join,暫不考慮優(yōu)化算法)算法來進(jìn)行表之間的連接操作的,大致過程如下:

  • 選取驅(qū)動表,使用與驅(qū)動表相關(guān)的過濾條件執(zhí)行對驅(qū)動表的單表查詢;
  • 對于查詢到的驅(qū)動表中的每一條紀(jì)錄,分別到被驅(qū)動表中查找匹配的紀(jì)錄。

偽代碼如下:

for each row in t1 {      // 遍歷滿足對t1單表查詢結(jié)果集中的每一條紀(jì)錄
    for each row in t2 {  // 對于某條t1紀(jì)錄,遍歷滿足對t2單表查詢結(jié)果集中的每一條紀(jì)錄
        if row satisfies join conditions, send to client
    }
}

1.2 show warnings命令

我們寫的sql語句,在經(jīng)過優(yōu)化器優(yōu)化后才會交給執(zhí)行器執(zhí)行,而show warnings命令則可以幫助我們獲得優(yōu)化器優(yōu)化后的sql。

2. 準(zhǔn)備工作

表結(jié)構(gòu)如下:

CREATE TABLE `student` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `stu_code` varchar(20) NOT NULL DEFAULT '',
  `stu_name` varchar(30) NOT NULL DEFAULT '',
  `stu_sex` varchar(10) NOT NULL DEFAULT '',
  `stu_age` int(10) NOT NULL DEFAULT '0',
  `stu_dept` varchar(30) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uq_stu_code` (`stu_code`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4

CREATE TABLE `course` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `cou_code` varchar(20) NOT NULL DEFAULT '',
  `cou_name` varchar(50) NOT NULL DEFAULT '',
  `cou_score` int(10) NOT NULL DEFAULT '0',
  `stu_code` varchar(20) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_stu_code_cou_code` (`stu_code`,`cou_code`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4

表數(shù)據(jù)如下: 

3. inner join內(nèi)連接on、where的區(qū)別

sql如下:

select * from student
inner join course on student.stu_code = course.stu_code
and student.stu_code >= 3 and course.cou_score >= 80;

執(zhí)行explain+sql命令: 

執(zhí)行show warnings命令: 

分析:從show warnings分析來看,對于inner join連接,經(jīng)過優(yōu)化器優(yōu)化后,on連接條件會轉(zhuǎn)化為where!也就是說內(nèi)連接中的where和on是等價的。

4. left join左連接on、where的區(qū)別

4.1 where驅(qū)動表過濾條件

sql如下:

select * from student
left join course on student.stu_code = course.stu_code
where student.stu_code >= 3;

執(zhí)行explain+sql命令: 

執(zhí)行show warnings命令: 

結(jié)果集: 

分析:從explain分析看出,student作為驅(qū)動表,把student.stu_code >= 3作為過濾條件進(jìn)行全表掃描,然后把查詢到的每條紀(jì)錄的student.stu_code(也就是on條件里面的)分別作為過濾條件讓被驅(qū)動表course做單表查詢。

4.2 on驅(qū)動表過濾條件

sql如下:

select * from student
left join course on student.stu_code = course.stu_code 
and student.stu_code >= 3;

執(zhí)行explain+sql命令: 

執(zhí)行show warnings命令: 

結(jié)果集: 

從結(jié)果集來看,student.stu_code >= 3并未生效,為什么?

分析:從explain分析看出,student作為驅(qū)動表,做全表掃描,然后把查詢到的每條記錄的student.stu_code和student.stu_code >= 3(也就是on條件里面的)分別做為過濾條件讓被驅(qū)動表做單表查詢;此時student.stu_code >= 3對驅(qū)動表是不過濾的,僅在連接被驅(qū)動表時生效,查詢不到符合紀(jì)錄而返回NULL!

4.3 on被驅(qū)動表過濾條件

sql如下:

select * from student
left join course on student.stu_code = course.stu_code 
and course.cou_score >= 80;

執(zhí)行explain+sql命令: 

執(zhí)行show warnings命令: 

結(jié)果集: 

分析:從explain分析看出,student作為驅(qū)動表,做全表掃描,然后把查詢到的每條記錄的student.stu_code和course.cou_score >= 80(也就是on條件里面的)分別做為過濾條件讓被驅(qū)動表做單表查詢;

4.4 where被驅(qū)動表過濾條件

sql如下: 

執(zhí)行explain+sql命令: 

執(zhí)行show warnings命令: 

結(jié)果集: 

從show warnings分析來看?left join連接變成了inner join連接?

分析:從show warnings分析看出,如果被驅(qū)動表有過濾條件在where,那么left join會被失效,被優(yōu)化成inner join連接。所以被驅(qū)動表的過濾條件應(yīng)該放在on而不是where。

5. 總結(jié)

其實,在內(nèi)連接的基礎(chǔ)上引入外連接的概念,就是為了解決驅(qū)動表中的紀(jì)錄即使沒有在被驅(qū)動表中找到匹配的紀(jì)錄,仍要加入結(jié)果集的問題。所以對于外連接(外連接包括:左連接、右連接),被驅(qū)動表的過濾條件我們應(yīng)該放在on!

到此這篇關(guān)于Mysql表連接的執(zhí)行流程詳解的文章就介紹到這了,更多相關(guān)Mysql表連接 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql遞歸查詢所有子集的實現(xiàn)方法

    mysql遞歸查詢所有子集的實現(xiàn)方法

    本文主要介紹了mysql遞歸查詢所有子集的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • mysql如何取分組之后最新的數(shù)據(jù)

    mysql如何取分組之后最新的數(shù)據(jù)

    開發(fā)中經(jīng)常會遇到,分組查詢最新數(shù)據(jù)的問題,下面這篇文章主要給大家介紹了關(guān)于mysql如何取分組之后最新的數(shù)據(jù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • mysql?count?為null時,顯示0的問題

    mysql?count?為null時,顯示0的問題

    這篇文章主要介紹了mysql?count?為null時,顯示0的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • mysql實現(xiàn)從導(dǎo)出數(shù)據(jù)的sql文件中只導(dǎo)入指定的一個表

    mysql實現(xiàn)從導(dǎo)出數(shù)據(jù)的sql文件中只導(dǎo)入指定的一個表

    這篇文章主要介紹了mysql實現(xiàn)從導(dǎo)出數(shù)據(jù)的sql文件中只導(dǎo)入指定的一個表,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • mysql 5.7.27 安裝配置方法圖文教程

    mysql 5.7.27 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.27 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • MySQL字符串拼接與分組拼接字符串實例代碼

    MySQL字符串拼接與分組拼接字符串實例代碼

    做SQL查詢時會經(jīng)常需要,把查詢的結(jié)果拼接成一個字符串,下面這篇文章主要給大家介紹了關(guān)于MySQL字符串拼接與分組拼接字符串的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • MySQL配置主從服務(wù)器(一主多從)

    MySQL配置主從服務(wù)器(一主多從)

    本文主要介紹了MySQL配置主從服務(wù)器,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 在MySQL中使用GTIDs復(fù)制協(xié)議和中斷協(xié)議的教程

    在MySQL中使用GTIDs復(fù)制協(xié)議和中斷協(xié)議的教程

    這篇文章主要介紹了在MySQL中使用GTIDs復(fù)制協(xié)議和中斷協(xié)議的教程,主要用于多個服務(wù)器之間的通信,需要的朋友可以參考下
    2015-04-04
  • MYSQL定時清除備份數(shù)據(jù)的具體操作

    MYSQL定時清除備份數(shù)據(jù)的具體操作

    這篇文章主要給大家介紹了關(guān)于MYSQL定時清除備份數(shù)據(jù)的具體操作,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MYSQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • mysql排序ORDER BY不生效的問題解決

    mysql排序ORDER BY不生效的問題解決

    order by作為一個常用的功能,在項目中應(yīng)該經(jīng)常用到,本文主要介紹了mysql排序ORDER BY不生效的問題解決,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10

最新評論

思茅市| 淮滨县| 右玉县| 重庆市| 广饶县| 紫阳县| 哈尔滨市| 大竹县| 玛纳斯县| 澳门| 土默特左旗| 砚山县| 天柱县| 平武县| 独山县| 竹溪县| 柳江县| 枣强县| 保定市| 宁乡县| 长治县| 元阳县| 安阳县| 呼图壁县| 贺州市| 白沙| 华宁县| 武邑县| 新建县| 湟中县| 漠河县| 合山市| 宜良县| 无极县| 吉林市| 南召县| 江津市| 会东县| 黔西| 郧西县| 壤塘县|