mysql中的运算符的执行顺序_【MySQL】执行顺序
我去找你??
我給你買??
我?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ǔ)句
插入語(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ù)
| id | name | subject | grade |
| 1 | Tom | 語(yǔ)文 | 88 |
| 2 | Tom | 數(shù)學(xué) | 99 |
| 3 | Tom | 外語(yǔ) | 55 |
| 4 | Jerry | 語(yǔ)文 | 67 |
| 5 | Jerry | 數(shù)學(xué) | 44 |
| 6 | Jerry | 外語(yǔ) | 55 |
| 7 | Speike | 語(yǔ)文 | 56 |
| 8 | Speike | 數(shù)學(xué) | 35 |
| 9 | Speike | 外語(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é)果:
| name | num |
| Jerry | 2 |
| Speike | 2 |
下面,我們開始剖析這句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é)果如下:
| id | name | subject | grade |
| 3 | Tom | 外語(yǔ) | 55 |
| 5 | Jerry | 數(shù)學(xué) | 44 |
| 5 | Jerry | 外語(yǔ) | 55 |
| 7 | Speike | 語(yǔ)文 | 56 |
| 8 | Speike | 數(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
| id | name | subject | grade |
| 3 | Tom | 外語(yǔ) | 55 |
- 表2 temp_2
| id | name | subject | grade |
| 5 | Jerry | 數(shù)學(xué) | 44 |
| 6 | Jerry | 外語(yǔ) | 55 |
- 表3 temp_3
| id | name | subject | grade |
| 7 | Speike | 語(yǔ)文 | 56 |
| 8 | Speike | 數(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é)果如下:
| name | num |
| Tom | 1 |
| Jerry | 2 |
| Speike | 2 |
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í)表
| name | num |
| Jerry | 2 |
| Speike | 2 |
6. ORDER BY num DESC
> 對(duì)內(nèi)存中的臨時(shí)表按照num和name進(jìn)行排序操作
num是DESC降序,name是ASC升序
ORDER BY num DESC, name ASC
| name | num |
| Jerry | 2 |
| Speike | 2 |
7. LIMIT 0,2
取排序后的前兩個(gè)
| name | num |
| Jerry | 2 |
| Speike | 2 |
備注: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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星 Galaxy A54 手机维修分数
- 下一篇: mysql win7 sp1 常见问题_