<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
對於連線操作,驅動表和被驅動表的關聯條件我們放在on後面,如果額外增加對驅動表和被驅動表的過濾條件,放到on或者where後面都不會報錯,但是得到的結果集卻是不一樣的???
眾所周知,mysql是基於巢狀迴圈連線(Nested-Loop Join,暫不考慮優化演演算法)演演算法來進行表之間的連線操作的,大致過程如下:
虛擬碼如下:
for each row in t1 { // 遍歷滿足對t1單表查詢結果集中的每一條紀錄 for each row in t2 { // 對於某條t1紀錄,遍歷滿足對t2單表查詢結果集中的每一條紀錄 if row satisfies join conditions, send to client } }
我們寫的sql語句,在經過優化器優化後才會交給執行器執行,而show warnings命令則可以幫助我們獲得優化器優化後的sql。
表結構如下:
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
表資料如下:
sql如下:
select * from student inner join course on student.stu_code = course.stu_code and student.stu_code >= 3 and course.cou_score >= 80;
執行explain+sql命令:
執行show warnings命令:
分析:從show warnings分析來看,對於inner join連線,經過優化器優化後,on連線條件會轉化為where!也就是說內連線中的where和on是等價的
。
sql如下:
select * from student left join course on student.stu_code = course.stu_code where student.stu_code >= 3;
執行explain+sql命令:
執行show warnings命令:
結果集:
分析:從explain分析看出,student作為驅動表,把student.stu_code >= 3作為過濾條件進行全表掃描,然後把查詢到的每條紀錄的student.stu_code(也就是on條件裡面的)分別作為過濾條件讓被驅動表course做單表查詢。
sql如下:
select * from student left join course on student.stu_code = course.stu_code and student.stu_code >= 3;
執行explain+sql命令:
執行show warnings命令:
結果集:
從結果集來看,student.stu_code >= 3並未生效,為什麼?
分析:從explain分析看出,student作為驅動表,做全表掃描,然後把查詢到的每條記錄的student.stu_code和student.stu_code >= 3(也就是on條件裡面的)分別做為過濾條件讓被驅動表做單表查詢;此時student.stu_code >= 3對驅動表是不過濾的,僅在連線被驅動表時生效,查詢不到符合紀錄而返回NULL!
sql如下:
select * from student left join course on student.stu_code = course.stu_code and course.cou_score >= 80;
執行explain+sql命令:
執行show warnings命令:
結果集:
分析:從explain分析看出,student作為驅動表,做全表掃描,然後把查詢到的每條記錄的student.stu_code和course.cou_score >= 80(也就是on條件裡面的)分別做為過濾條件讓被驅動表做單表查詢;
sql如下:
執行explain+sql命令:
執行show warnings命令:
結果集:
從show warnings分析來看?left join連線變成了inner join連線?
分析:從show warnings分析看出,如果被驅動表有過濾條件在where,那麼left join會被失效,被優化成inner join連線。所以被驅動表的過濾條件應該放在on而不是where
。
其實,在內連線的基礎上引入外連線的概念,就是為了解決驅動表中的紀錄即使沒有在被驅動表中找到匹配的紀錄,仍要加入結果集的問題
。所以對於外連線(外連線包括:左連線、右連線),被驅動表的過濾條件我們應該放在on!
到此這篇關於Mysql表連線的執行流程詳解的文章就介紹到這了,更多相關Mysql表連線 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45