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

Mysql查詢語句執(zhí)行過程及運行原理分析

 更新時間:2023年08月11日 16:53:33   作者:sinat_32176267  
這篇文章主要介紹了Mysql查詢語句執(zhí)行過程及運行原理分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Mysql查詢語句執(zhí)行原理

數(shù)據(jù)庫查詢語句如何執(zhí)行?

  • DML語句首先進行語法分析,對使用sql表示的查詢進行語法分析,生成查詢語法分析樹。
  • 語義檢查:檢查sql中所涉及的對象以及是否在數(shù)據(jù)庫中存在,用戶是否具有操作權限等
  • 視圖轉(zhuǎn)換:將語法分析樹轉(zhuǎn)換成關系代數(shù)表達式,稱為邏輯查詢計劃;
  • 查詢優(yōu)化:在選擇邏輯查詢計劃時,會有多個不同的表達式,選擇最佳的邏輯查詢計劃;
  • 代碼生成:必須將邏輯查詢計劃轉(zhuǎn)換成物理查詢計劃,物理查詢計劃不僅能指明要執(zhí)行的操作,也給出了這些操作的執(zhí)行順序,每步所用的算法,存儲數(shù)據(jù)的方式以及從一個操作傳遞給另一個操作的方式。
  • 將DML轉(zhuǎn)換成一串可執(zhí)行的存取操作的過程稱為束縛過程,

Mysql查詢語句執(zhí)行過程

這里簡單介紹一下mysql數(shù)據(jù)庫,mysql數(shù)據(jù)庫是一款關系型數(shù)據(jù)庫,所謂關系型數(shù)據(jù)庫就是以二維表的形式存儲數(shù)據(jù),使用行和列方便我們對數(shù)據(jù)的增刪改查。

這篇博客,我們以mysql數(shù)據(jù)庫為例,對一條sql語句的執(zhí)行流程進行分析。(本篇博客不涉及到表連接)

首先,創(chuàng)建一張student表,字段有自增主鍵id,學生姓名name,學科subject,成績grade

建表語句

DROP TABLE IF EXISTS student;
CREATE TABLE `student` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `subject` varchar(10) DEFAULT NULL,
  `grade` double(4,1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8;

初始化數(shù)據(jù)

INSERT INTO student(`name`,`subject`,grade)VALUES('aom','語文',88);
INSERT INTO student(`name`,`subject`,grade)VALUES('aom','數(shù)學',99);
INSERT INTO student(`name`,`subject`,grade)VALUES('aom','外語',55);
INSERT INTO student(`name`,`subject`,grade)VALUES('jack','語文',67);
INSERT INTO student(`name`,`subject`,grade)VALUES('jack','數(shù)學',44);
INSERT INTO student(`name`,`subject`,grade)VALUES('jack','外語',55);
INSERT INTO student(`name`,`subject`,grade)VALUES('susan','語文',56);
INSERT INTO student(`name`,`subject`,grade)VALUES('susan','數(shù)學',35);
INSERT INTO student(`name`,`subject`,grade)VALUES('susan','外語',77);
INSERT INTO student(`name`,`subject`,grade)VALUES('alice','語文',88);
INSERT INTO student(`name`,`subject`,grade)VALUES('alice','數(shù)學',77);
INSERT INTO student(`name`,`subject`,grade)VALUES('alice','外語',100);
INSERT INTO student(`name`,`subject`,grade)VALUES('rajo','語文',33);
INSERT INTO student(`name`,`subject`,grade)VALUES('rajo','數(shù)學',55);
INSERT INTO student(`name`,`subject`,grade)VALUES('rajo','外語',55);

下面我們來看一下,數(shù)據(jù)在數(shù)據(jù)庫中的存儲形式。

(圖1.0)

現(xiàn)在針對這張student表中的數(shù)據(jù)提出一個問題:要求查詢出掛科數(shù)目多于兩門(包含兩門)的前兩名學生的姓名,如果掛科數(shù)目相同按學生姓名升序排列。

下面是這條查詢的sql語句

SELECT `name`,COUNT(`name`) AS num FROM student WHERE grade < 60 GROUP BY `name` HAVING num >= 2 ORDER BY num DESC,`name` ASC LIMIT 0,2;

執(zhí)行結(jié)果:

圖(1.1)

以上這條sql語句基本上概括了單表查詢中所有要注意的點,那么我們就以這條sql為例來分析一下一條語句的執(zhí)行流程。

1,一條查詢的sql語句先執(zhí)行的是 FROM student 負責把數(shù)據(jù)庫的表文件加載到內(nèi)存中去,如圖1.0中所示。(mysql數(shù)據(jù)庫在計算機上也是一個進程,cpu會給該進程分配一塊內(nèi)存空間,在計算機‘服務’中可以看到,該進程的狀態(tài))

圖(1.2)

2,WHERE grade < 60,會把(圖1.0)所示表中的數(shù)據(jù)進行過濾,取出符合條件的記錄行,生成一張臨時表,如下圖所示。

圖(1.3)

3,GROUP BY `name`會把圖(1.3)的臨時表切分成若干臨時表,分為四個分組,我們用下圖來表示內(nèi)存中這個切分的過程。

圖(1.4)

    

圖(1.5)

圖(1.6)

圖(1.7)

4,SELECT 的執(zhí)行讀取規(guī)則分為sql語句中有無GROUP BY兩種情況。

(1)當沒有GROUP BY時,SELECT 會根據(jù)后面的字段名稱對內(nèi)存中的一張臨時表整列讀取。

(2)當查詢sql中有GROUP BY時,會對內(nèi)存中的若干臨時表分別執(zhí)行SELECT,而且只取各臨時表中的第一條記錄,然后再形成新的臨時表。這就決定了查詢sql使用GROUP BY的場景下,SELECT后面跟的一般是參與分組的字段和聚合函數(shù),否則查詢出的數(shù)據(jù)要是情況而定。另外聚合函數(shù)中的字段可以是表中的任意字段,需要注意的是聚合函數(shù)會自動忽略空值。

我們還是以本例中的查詢sql來分析,現(xiàn)在內(nèi)存中有四張被GROUP BY `name`切分成的臨時表,我們分別取名為 tempTable1,tempTable2,tempTable3,tempTable4分別對應圖(1.4)、圖(1.5)、圖(1.6),圖(1.7)下面寫四條"偽SQL"來說明這個查詢過程。

SELECT `name`,COUNT(`name`) AS num FROM tempTable1;
SELECT `name`,COUNT(`name`) AS num FROM tempTable2;
SELECT `name`,COUNT(`name`) AS num FROM tempTable3;
SELECT `name`,COUNT(`name`) AS num FROM tempTable4;

最后再次成新的臨時表,如下圖:

圖(1.8)

5,HAVING num >= 2對上圖所示臨時表中的數(shù)據(jù)再次過濾,與WHERE語句不同的是HAVING 用在GROUP BY之后,WHERE是對FROM student從數(shù)據(jù)庫表文件加載到內(nèi)存中的原生數(shù)據(jù)過濾,而HAVING 是對SELECT 語句執(zhí)行之后的臨時表中的數(shù)據(jù)過濾,所以說column AS otherName ,otherName這樣的字段在WHERE后不能使用,但在HAVING 后可以使用。

但HAVING的后使用的字段只能是SELECT 后的字段,SELECT后沒有的字段HAVING之后不能使用。

HAVING num >= 2語句執(zhí)行之后生成一張臨時表,如下:

圖(1.9)

6,ORDER BY num DESC,`name` ASC對以上的臨時表按照num,name進行排序。

7,LIMIT 0,2取排序后的前兩個。

1014108-20170304213248720-869809358.png

轉(zhuǎn)存失敗重新上傳取消

以上就是一條sql的執(zhí)行過程,同時我們在書寫查詢sql的時候應當遵守以下順序。

SELECT XXX FROM XXX WHERE XXX GROUP BY XXX HAVING XXX ORDER BY XXX LIMIT XXX;

總結(jié)

這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • MySQL定時器EVENT學習筆記

    MySQL定時器EVENT學習筆記

    本文為大家介紹下MySQL定時器EVENT,要使定時起作用 MySQL的常量GLOBAL event_scheduler必須為on或者是1,感興趣的朋友可以了解下
    2013-11-11
  • MySQL日期格式以及日期函數(shù)舉例詳解

    MySQL日期格式以及日期函數(shù)舉例詳解

    這篇文章主要給大家介紹了關于MySQL日期格式及日期函數(shù)的相關資料,日期在數(shù)據(jù)庫中是一個常見且重要的數(shù)據(jù)類型,在MySQL中我們可以使用各種函數(shù)和格式化選項來處理和顯示日期,需要的朋友可以參考下
    2023-11-11
  • MySQL中登錄與退出超全圖文講解

    MySQL中登錄與退出超全圖文講解

    大多數(shù)人都認為在不需要事務化處理的情況下,MySQL是管理內(nèi)容最好的選擇,下面這篇文章主要給大家介紹了關于MySQL中登錄與退出圖文講解的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • MySql避免重復插入記錄的幾種方法

    MySql避免重復插入記錄的幾種方法

    本文章來給大家提供三種在mysql中避免重復插入記錄方法,主要是講到了ignore,Replace,ON DUPLICATE KEY UPDATE三種方法,有需要的朋友可以參考一下
    2013-08-08
  • 深入mysql創(chuàng)建自定義函數(shù)與存儲過程的詳解

    深入mysql創(chuàng)建自定義函數(shù)與存儲過程的詳解

    本篇文章是對mysql創(chuàng)建自定義函數(shù)與存儲過程進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • 手把手教你使用Navicat查詢表的詳細結(jié)構(gòu)

    手把手教你使用Navicat查詢表的詳細結(jié)構(gòu)

    在使用Navicat時,我們可以通過執(zhí)行一些SQL語句來查看表結(jié)構(gòu),下面這篇文章主要給大家介紹了關于如何使用Navicat查詢表的詳細結(jié)構(gòu),文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • MySQL授權命令grant的使用方法小結(jié)

    MySQL授權命令grant的使用方法小結(jié)

    這篇文章主要介紹了MySQL授權命令grant的使用方法,本文實例,運行于?MySQL?5.0?及以上版本,介紹了MySQL?賦予用戶權限命令的簡單格式,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2021-12-12
  • MySQL8.0報錯Public?Key?Retrieval?is?not?allowed的原因及解決方法

    MySQL8.0報錯Public?Key?Retrieval?is?not?allowed的原因及解決方法

    這篇文章主要給大家介紹了MySQL8.0報錯Public?Key?Retrieval?is?not?allowed的原因及解決方法,文中通過代碼示例和圖文介紹的非常詳細,有遇到相同問題的朋友可以參考閱讀一下
    2024-01-01
  • homeassistant數(shù)據(jù)存儲到mysql數(shù)據(jù)庫方式

    homeassistant數(shù)據(jù)存儲到mysql數(shù)據(jù)庫方式

    這篇文章主要介紹了homeassistant數(shù)據(jù)存儲到mysql數(shù)據(jù)庫方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • MYSQL查看表是否被鎖以及解鎖過程

    MYSQL查看表是否被鎖以及解鎖過程

    這篇文章主要介紹了MYSQL查看表是否被鎖以及解鎖過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-10-10

最新評論

金昌市| 保定市| 同江市| 石棉县| 余姚市| 巴东县| 绍兴市| 平乡县| 八宿县| 宣恩县| 静海县| 乌苏市| 尚志市| 台南市| 罗甸县| 济源市| 囊谦县| 页游| 绥宁县| 曲麻莱县| 陆河县| 屯昌县| 城固县| 汉阴县| 射洪县| 江口县| 礼泉县| 开远市| 菏泽市| 武山县| 克山县| 通河县| 卢龙县| 中宁县| 夏邑县| 闸北区| 布尔津县| 阿巴嘎旗| 理塘县| 北安市| 格尔木市|