搜尋
首頁資料庫mysql教程Mysql表連接的執行流程是什麼
Mysql表連接的執行流程是什麼Jun 01, 2023 pm 05:26 PM
mysql

    1. 前言

    對於連接操作,驅動表和被驅動表的關聯條件我們放在on後面,如果額外增加對驅動表和被驅動表的篩選條件,放到on或where後面都不會報錯,但是得到的結果集卻是不一樣的? ? ?

    1.1 mysql連接的原理

    眾所周知,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
        }
    }

    #1.2 show warnings指令

    我們寫的sql語句,在經過最佳化器最佳化之後才會交給執行器執行,而show warnings指令則可以幫助我們取得優化器最佳化後的sql。

    2. 準備工作

    表格結構如下:

    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

    表格資料如下: 

    Mysql表連接的執行流程是什麼

    3. inner join內連接on、where的差異

    #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指令: 

    Mysql表連接的執行流程是什麼

    執行show warnings指令: 

    Mysql表連接的執行流程是什麼

    分析:從show warnings分析來看,對於inner join連接,經過最佳化器最佳化後,on連接條件會轉換為where!也就是說內連接中的where和on是等價的

    4. left join左連接on、where的區別

    4.1 where驅動表過濾條件

    sql如下:

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

    執行explain sql指令: 

    Mysql表連接的執行流程是什麼

    #執行show warnings指令: 

    Mysql表連接的執行流程是什麼

    ##執行show warnings指令: 

    Mysql表連接的執行流程是什麼

    #結果集: 

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

    4.2 on驅動程式表篩選條件

    sql如下:

    select * from student
    left join course on student.stu_code = course.stu_code 
    and student.stu_code >= 3;
    Mysql表連接的執行流程是什麼

    執行explain sql指令: 

    Mysql表連接的執行流程是什麼

    #執行show warnings指令: 

    Mysql表連接的執行流程是什麼

    #結果集: 

    #從結果集來看,student.stu_code >= 3並未生效,為什麼?

    分析:

    從explain分析看出,student作為驅動表,做全表掃描,然後把查詢到的每筆記錄的student.stu_code和student.stu_code >= 3 (也就是on條件裡面的)分別做為過濾條件讓被驅動表做單表查詢;

    此時student.stu_code >= 3對驅動表是不過濾的,僅在連接被驅動表時生效,查詢不到符合紀錄而回傳NULL!

    4.3 on被驅動程式表篩選條件

    sql如下:

    select * from student
    left join course on student.stu_code = course.stu_code 
    and course.cou_score >= 80;
    Mysql表連接的執行流程是什麼

    執行explain sql指令: 

    Mysql表連接的執行流程是什麼

    #執行show warnings指令: 

    Mysql表連接的執行流程是什麼

    結果集: ##### ###########

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

    4.4 where被驅動表過濾條件

    sql如下: 

    Mysql表連接的執行流程是什麼

    執行explain sql指令: 

    Mysql表連接的執行流程是什麼

    執行show warnings指令: 

    Mysql表連接的執行流程是什麼

    #結果集: 

    Mysql表連接的執行流程是什麼

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

    分析:從show warnings分析看出,如果被驅動表有過濾條件在where,那麼left join會被失效,被優化成inner join連接。所以被驅動表的篩選條件應該放在on而不是where

    以上是Mysql表連接的執行流程是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
    图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

    本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

    mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

    在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

    mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

    mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

    mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

    方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

    mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

    转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

    MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

    本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

    带你把MySQL索引吃透了带你把MySQL索引吃透了Apr 22, 2022 am 11:48 AM

    本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

    mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

    在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    AI Hentai Generator

    AI Hentai Generator

    免費產生 AI 無盡。

    熱門文章

    R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
    2 週前By尊渡假赌尊渡假赌尊渡假赌
    倉庫:如何復興隊友
    4 週前By尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island冒險:如何獲得巨型種子
    3 週前By尊渡假赌尊渡假赌尊渡假赌

    熱工具

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    SAP NetWeaver Server Adapter for Eclipse

    SAP NetWeaver Server Adapter for Eclipse

    將Eclipse與SAP NetWeaver應用伺服器整合。

    mPDF

    mPDF

    mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

    Atom編輯器mac版下載

    Atom編輯器mac版下載

    最受歡迎的的開源編輯器