日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql中的运算符的执行顺序_【MySQL】执行顺序

發(fā)布時(shí)間:2023/12/15 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql中的运算符的执行顺序_【MySQL】执行顺序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我去找你??

我給你買??

我?guī)闳??

我很愛你??

我們回家??

我們結(jié)婚??

你聽過最孤獨(dú)的話是什么?

同學(xué),code就剩你沒提交了

今天討論的話題是

MySQL執(zhí)行順序

???

先養(yǎng)眼,再看題

??

今天還是小姐姐

前言

相信有不少小伙伴都是談sql色變

什么是sql

sql怎么寫

sql怎么又報(bào)錯(cuò)了

致命三連

那么在此

我也會(huì)將sql的一個(gè)大致模版講解給大家

以后大家寫sql可以照著這個(gè)模版寫就好了

[toc]

- MySQL執(zhí)行過程

- Demo

- 開始分析

????- 1. FROM student temp

????- 2. WHERE

????- 3. GROUP BY name

????- 4. COUNT(name) AS num

????- 5. HAVING num >= 2

????- 6. ORDER BY num DESC

????- 7. LIMIT 0,2

????- 備注:JOIN

- 總結(jié)

MySQL執(zhí)行過程

>?SQL語(yǔ)言,本身就是對(duì)MySQL數(shù)據(jù)查詢的語(yǔ)言。并且也是腳本式語(yǔ)言,可直接運(yùn)行在數(shù)據(jù)庫(kù)上。

雖然說不同的數(shù)據(jù)庫(kù)有不同的方言,有各自的性格,比如trim(),ifnull()等方法在oracle數(shù)據(jù)庫(kù)中就沒有,但是top()等方法在MySQL中就沒有。

其實(shí)核心思想都是一樣的,都是為了對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。只是,不同的數(shù)據(jù)庫(kù)對(duì)同一條SQL語(yǔ)句的底層實(shí)現(xiàn)方式不同罷了。

其實(shí)就好像JAVA接口一樣,不同的數(shù)據(jù)庫(kù),接口的實(shí)現(xiàn)類也不同,但是對(duì)同一條SQL語(yǔ)句的執(zhí)行是相同的

MySQL就是個(gè)關(guān)系型數(shù)據(jù)庫(kù),由二維表的形式存儲(chǔ)數(shù)據(jù),使用行和列對(duì)數(shù)據(jù)進(jìn)行CRUD

Demo

我們就用一個(gè)簡(jiǎn)單的demo來解釋一條sql語(yǔ)句的執(zhí)行流程分析

首先,創(chuàng)建表student,有自增id,學(xué)生姓名name,學(xué)科subject,成績(jī)grade


建表語(yǔ)句

-- 創(chuàng)建student_temp表DROP TABLE IF EXISTS student_temp;CREATE TABLE student_temp( 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 DEFAULT CHARSET = utf8;

插入語(yǔ)句(insert into 或 insert select)

-- 向student_temp表插入數(shù)據(jù)student_tempinsert into student_temp (name, subject, grade)select 'Tom', '語(yǔ)文', 88union allselect 'Tom', '數(shù)學(xué)', 99union allselect 'Tom', '外語(yǔ)', 55;INSERT INTO student_temp(name, subject, grade)VALUES ('Jerry', '語(yǔ)文', 67);INSERT INTO student_temp(name, subject, grade)VALUES ('Jerry', '數(shù)學(xué)', 44);INSERT INTO student_temp(name, subject, grade)VALUES ('Jerry', '外語(yǔ)', 55);INSERT INTO student_temp(name, subject, grade)VALUES ('Speike', '語(yǔ)文', 56);INSERT INTO student_temp(name, subject, grade)VALUES ('Speike', '數(shù)學(xué)', 35);INSERT INTO student_temp(name, subject, grade)VALUES ('Speike', '外語(yǔ)', 77);

這是表的數(shù)據(jù)

idnamesubjectgrade
1Tom語(yǔ)文88
2Tom數(shù)學(xué)99
3Tom外語(yǔ)55
4Jerry語(yǔ)文67
5Jerry數(shù)學(xué)44
6Jerry外語(yǔ)55
7Speike語(yǔ)文56
8Speike數(shù)學(xué)35
9Speike外語(yǔ)77

開始分析

需求:要求查詢出掛科數(shù)目多于兩門(包含兩門)的前兩名學(xué)生的姓名,如果掛科數(shù)目相同按學(xué)生姓名升序排列

SELECT name, COUNT(name) AS numFROM student_tempWHERE grade < 60GROUP BY nameHAVING num >= 2ORDER BY num DESC, name ASCLIMIT 0,2;

查詢結(jié)果:

namenum
Jerry2
Speike2

下面,我們開始剖析這句sql

你品,你細(xì)細(xì)的品

1. FROM stuednt_temp

>?負(fù)責(zé)將數(shù)據(jù)插入到內(nèi)存中

mysql在計(jì)算機(jī)中是一個(gè)進(jìn)程,cpu會(huì)給這個(gè)進(jìn)程分配一個(gè)內(nèi)存空間(類似于yarn)

2. WHERE grade < 60

>?會(huì)將數(shù)據(jù)進(jìn)行過濾,篩選出符合條件的數(shù)據(jù),并聲稱一張臨時(shí)表放進(jìn)去(基于內(nèi)存的)

結(jié)果如下:

idnamesubjectgrade
3Tom外語(yǔ)55
5Jerry數(shù)學(xué)44
5Jerry外語(yǔ)55
7Speike語(yǔ)文56
8Speike數(shù)學(xué)35

3. GROUP BY name

> 會(huì)將剛剛的結(jié)果的臨時(shí)表進(jìn)行切分成若干個(gè)臨時(shí)表。

????1. 當(dāng)沒有GROUP BY時(shí),SELECT會(huì)根據(jù)后面的條件對(duì)內(nèi)存中上面的臨時(shí)表進(jìn)行讀取

????2. 當(dāng)有GROUP BY時(shí),會(huì)將切分后的數(shù)據(jù)SELECT,再根據(jù)參與分組的字段聚合函數(shù)生成結(jié)果(聚合函數(shù)自動(dòng)忽略空格)

so,剛內(nèi)存中的那張臨時(shí)表,就被GROUP BY name切分為3張臨時(shí)表

結(jié)果如下 :

- 表1 temp_1

idnamesubjectgrade
3Tom外語(yǔ)55

- 表2 temp_2

idnamesubjectgrade
5Jerry數(shù)學(xué)44
6Jerry外語(yǔ)55

- 表3 temp_3

idnamesubjectgrade
7Speike語(yǔ)文56
8Speike數(shù)學(xué)35

4. COUNT(name) AS num

> 再次形成一張臨時(shí)表

再根據(jù)聚合參數(shù)count()再次形成一張臨時(shí)表

SELECT name , count(name) as num from temp_1;SELECT name , count(name) as num from temp_2;SELECT name , count(name) as num from temp_3;

結(jié)果如下:

namenum
Tom1
Jerry2
Speike2

5. HAVING num >= 2

> 再次對(duì)如上結(jié)果進(jìn)行過濾,生成一張新的臨時(shí)表

這個(gè)時(shí)候,我們就能看出來WHERE和HAVING的不同:

HAVING是在GROUP BY之后進(jìn)行使用。

WHERE是對(duì)FROM student_temp從數(shù)據(jù)庫(kù)文件加載到內(nèi)存中進(jìn)行過濾


HAVING是對(duì)SELECT執(zhí)行后的臨時(shí)表進(jìn)行過濾,所以HAVING只能對(duì)SELECT的字段進(jìn)行操作,并生成一張臨時(shí)表

namenum
Jerry2
Speike2

6. ORDER BY num DESC

> 對(duì)內(nèi)存中的臨時(shí)表按照num和name進(jìn)行排序操作

num是DESC降序,name是ASC升序


ORDER BY num DESC, name ASC

namenum
Jerry2
Speike2

7. LIMIT 0,2

取排序后的前個(gè)

namenum
Jerry2
Speike2

備注:JOIN

join表示要關(guān)聯(lián)的表,on是要連接的條件。


通過from和join指出要執(zhí)行的table_A和table_B。


首先通過笛卡爾積產(chǎn)生臨時(shí)表Temp1


通過on生成臨時(shí)表Temp2

簡(jiǎn)單來講就是通過Table_A,生成一張臨時(shí)表Temp1,然找到Tabe_B的id和Table_A的id相同的部分組成表Temp2,Temp2里面包含了兩表相同的數(shù)據(jù)

總結(jié)

以上就是一條SQL的執(zhí)行過程

so,我們以后寫SQL也要有如下模版

SELECT XXXFROM XXXWHERE XXXGROUP BY XXXHAVING XXXORDER BY XXXLIMIT XXX;

附圖如下:

?陽(yáng)光明媚 清風(fēng)徐來

掃碼關(guān)注我

郭大熊的公眾號(hào)

個(gè)人博客 : www.guodaxiong.com

如果不曾見過陽(yáng)光,我本可以忍受黑暗

?Hi GuoDaXiong?

我是狗子

祝你幸福

總結(jié)

以上是生活随笔為你收集整理的mysql中的运算符的执行顺序_【MySQL】执行顺序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。