亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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é)

其實(shí),在內(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與PHP的基礎(chǔ)與應(yīng)用專題之創(chuàng)建數(shù)據(jù)庫表

    MySQL與PHP的基礎(chǔ)與應(yīng)用專題之創(chuàng)建數(shù)據(jù)庫表

    MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,本系列將帶你掌握php與mysql的基礎(chǔ)應(yīng)用,本篇從數(shù)據(jù)庫的創(chuàng)建開始
    2022-02-02
  • mysql5.5 master-slave(Replication)主從配置

    mysql5.5 master-slave(Replication)主從配置

    在主機(jī)master中對test數(shù)據(jù)庫進(jìn)行sql操作,再查看從機(jī)test數(shù)據(jù)庫是否產(chǎn)生同步。
    2011-07-07
  • 一文詳解MySQL的并發(fā)控制

    一文詳解MySQL的并發(fā)控制

    無論何時只要有多個查詢需要在同一時刻修改數(shù)據(jù),都會產(chǎn)生并發(fā)控制問題,MySQL可以在兩個層面進(jìn)行并發(fā)控制,服務(wù)器層和存儲引擎層,下面這篇文章主要給大家介紹了關(guān)于MySQL并發(fā)控制的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • linux下mysql 5.1 和 5.7的安裝教程

    linux下mysql 5.1 和 5.7的安裝教程

    下面小編就為大家分享一篇linux下mysql 5.1 和 5.7的安裝教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • MySQL命令無法輸入中文問題的解決方式

    MySQL命令無法輸入中文問題的解決方式

    這篇文章主要給大家介紹了關(guān)于MySQL命令無法輸入中文問題的解決方式,文中給出了詳細(xì)的解決方案,對遇到這個問題的同學(xué)有很大的幫助,需要的朋友可以參考下
    2021-08-08
  • MySQL數(shù)據(jù)時區(qū)問題以及datetime和timestamp類型存儲的差異

    MySQL數(shù)據(jù)時區(qū)問題以及datetime和timestamp類型存儲的差異

    這篇文章主要介紹了MySQL數(shù)據(jù)時區(qū)問題以及datetime和timestamp類型存儲的差異,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Linux環(huán)境下安裝MySQL8.0的完整步驟

    Linux環(huán)境下安裝MySQL8.0的完整步驟

    數(shù)據(jù)庫想必大家都很熟悉,但是要在服務(wù)器上自己來安裝數(shù)據(jù)庫,還是會出現(xiàn)不少的問題,下面這篇文章主要給大家介紹了關(guān)于在Linux環(huán)境下安裝MySQL8.0的完整步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 關(guān)于MySQL中explain工具的使用

    關(guān)于MySQL中explain工具的使用

    這篇文章主要介紹了關(guān)于MySQL中explain工具的使用,在select語句之前增加explain關(guān)鍵字,MySQL會在查詢上設(shè)置一個標(biāo)記,執(zhí)行查詢會返回執(zhí)行計(jì)劃的信息,而不是執(zhí)行這條SQL,需要的朋友可以參考下
    2023-05-05
  • MySQL group by和left join并用解決方式

    MySQL group by和left join并用解決方式

    這篇文章主要介紹了MySQL group by和left join并用解決方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • mysql中數(shù)據(jù)庫與數(shù)據(jù)表編碼格式的查看、創(chuàng)建及修改

    mysql中數(shù)據(jù)庫與數(shù)據(jù)表編碼格式的查看、創(chuàng)建及修改

    這篇文章給大家介紹了如何查看、創(chuàng)建以及修改數(shù)據(jù)庫與數(shù)據(jù)表的編碼格式,另外還給大家分享了添加和刪除外鍵的示例代碼,文中介紹的很詳細(xì),對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值,有需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11

最新評論