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

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

 更新時間:2022年08月25日 11:37:14   作者:Balloon???????  
這篇文章主要介紹了Mysql表連接的執(zhí)行流程詳解,文章圍繞主題展開詳細的內(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)化算法)算法來進行表之間的連接操作的,大致過程如下:

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

偽代碼如下:

for each row in t1 {      // 遍歷滿足對t1單表查詢結(jié)果集中的每一條紀錄
    for each row in t2 {  // 對于某條t1紀錄,遍歷滿足對t2單表查詢結(jié)果集中的每一條紀錄
        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. 準備工作

表結(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作為過濾條件進行全表掃描,然后把查詢到的每條紀錄的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ū)動表時生效,查詢不到符合紀錄而返回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ū)動表中的紀錄即使沒有在被驅(qū)動表中找到匹配的紀錄,仍要加入結(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)方法,文中通過示例代碼介紹的非常詳細,對大家的學(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)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    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 安裝配置方法圖文教程

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

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

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

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

    本文主要介紹了MySQL配置主從服務(wù)器,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    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ù)的具體操作,文中通過示例代碼介紹的非常詳細,對大家學(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

最新評論

大渡口区| 大埔县| 都昌县| 滦南县| 庆云县| 新乡市| 洪江市| 赤壁市| 绿春县| 五峰| 容城县| 邮箱| 永春县| 竹溪县| 梧州市| 南昌市| 南召县| 通榆县| 安化县| 公主岭市| 通化县| 土默特左旗| 海原县| 册亨县| 江川县| 台山市| 洪湖市| 政和县| 固安县| 昌宁县| 灌南县| 沽源县| 汕头市| 林甸县| 大新县| 二连浩特市| 紫金县| 太保市| 黄石市| 韩城市| 汝州市|