mysql中的运算符的执行顺序_【MySQL】执行顺序
我去找你??
我給你買??
我帶你去??
我很愛你??
我們回家??
我們結婚??
你聽過最孤獨的話是什么?
同學,code就剩你沒提交了
今天討論的話題是
MySQL執行順序
???
先養眼,再看題
??
今天還是小姐姐
前言
相信有不少小伙伴都是談sql色變
什么是sql
sql怎么寫
sql怎么又報錯了
致命三連
那么在此
我也會將sql的一個大致模版講解給大家
以后大家寫sql可以照著這個模版寫就好了
[toc]
- MySQL執行過程
- 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
- 總結
MySQL執行過程
>?SQL語言,本身就是對MySQL數據查詢的語言。并且也是腳本式語言,可直接運行在數據庫上。
雖然說不同的數據庫有不同的方言,有各自的性格,比如trim(),ifnull()等方法在oracle數據庫中就沒有,但是top()等方法在MySQL中就沒有。
其實核心思想都是一樣的,都是為了對數據庫進行操作。只是,不同的數據庫對同一條SQL語句的底層實現方式不同罷了。
其實就好像JAVA接口一樣,不同的數據庫,接口的實現類也不同,但是對同一條SQL語句的執行是相同的。
MySQL就是個關系型數據庫,由二維表的形式存儲數據,使用行和列對數據進行CRUD。
Demo
我們就用一個簡單的demo來解釋一條sql語句的執行流程分析。
首先,創建表student,有自增id,學生姓名name,學科subject,成績grade
建表語句
插入語句(insert into 或 insert select)
-- 向student_temp表插入數據student_tempinsert into student_temp (name, subject, grade)select 'Tom', '語文', 88union allselect 'Tom', '數學', 99union allselect 'Tom', '外語', 55;INSERT INTO student_temp(name, subject, grade)VALUES ('Jerry', '語文', 67);INSERT INTO student_temp(name, subject, grade)VALUES ('Jerry', '數學', 44);INSERT INTO student_temp(name, subject, grade)VALUES ('Jerry', '外語', 55);INSERT INTO student_temp(name, subject, grade)VALUES ('Speike', '語文', 56);INSERT INTO student_temp(name, subject, grade)VALUES ('Speike', '數學', 35);INSERT INTO student_temp(name, subject, grade)VALUES ('Speike', '外語', 77);這是表的數據
| id | name | subject | grade |
| 1 | Tom | 語文 | 88 |
| 2 | Tom | 數學 | 99 |
| 3 | Tom | 外語 | 55 |
| 4 | Jerry | 語文 | 67 |
| 5 | Jerry | 數學 | 44 |
| 6 | Jerry | 外語 | 55 |
| 7 | Speike | 語文 | 56 |
| 8 | Speike | 數學 | 35 |
| 9 | Speike | 外語 | 77 |
開始分析
需求:要求查詢出掛科數目多于兩門(包含兩門)的前兩名學生的姓名,如果掛科數目相同按學生姓名升序排列
SELECT name, COUNT(name) AS numFROM student_tempWHERE grade < 60GROUP BY nameHAVING num >= 2ORDER BY num DESC, name ASCLIMIT 0,2;查詢結果:
| name | num |
| Jerry | 2 |
| Speike | 2 |
下面,我們開始剖析這句sql
你品,你細細的品
1. FROM stuednt_temp
>?負責將數據插入到內存中
mysql在計算機中是一個進程,cpu會給這個進程分配一個內存空間(類似于yarn)
2. WHERE grade < 60
>?會將數據進行過濾,篩選出符合條件的數據,并聲稱一張臨時表放進去(基于內存的)
結果如下:
| id | name | subject | grade |
| 3 | Tom | 外語 | 55 |
| 5 | Jerry | 數學 | 44 |
| 5 | Jerry | 外語 | 55 |
| 7 | Speike | 語文 | 56 |
| 8 | Speike | 數學 | 35 |
3. GROUP BY name
> 會將剛剛的結果的臨時表進行切分成若干個臨時表。
????1. 當沒有GROUP BY時,SELECT會根據后面的條件對內存中上面的臨時表進行讀取
????2. 當有GROUP BY時,會將切分后的數據SELECT,再根據參與分組的字段或聚合函數生成結果(聚合函數自動忽略空格)
so,剛內存中的那張臨時表,就被GROUP BY name切分為3張臨時表
結果如下 :
- 表1 temp_1
| id | name | subject | grade |
| 3 | Tom | 外語 | 55 |
- 表2 temp_2
| id | name | subject | grade |
| 5 | Jerry | 數學 | 44 |
| 6 | Jerry | 外語 | 55 |
- 表3 temp_3
| id | name | subject | grade |
| 7 | Speike | 語文 | 56 |
| 8 | Speike | 數學 | 35 |
4. COUNT(name) AS num
> 再次形成一張臨時表
再根據聚合參數count()再次形成一張臨時表
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;結果如下:
| name | num |
| Tom | 1 |
| Jerry | 2 |
| Speike | 2 |
5. HAVING num >= 2
> 再次對如上結果進行過濾,生成一張新的臨時表
這個時候,我們就能看出來WHERE和HAVING的不同:
HAVING是在GROUP BY之后進行使用。
WHERE是對FROM student_temp從數據庫文件加載到內存中進行過濾
HAVING是對SELECT執行后的臨時表進行過濾,所以HAVING只能對SELECT的字段進行操作,并生成一張臨時表
| name | num |
| Jerry | 2 |
| Speike | 2 |
6. ORDER BY num DESC
> 對內存中的臨時表按照num和name進行排序操作
num是DESC降序,name是ASC升序
ORDER BY num DESC, name ASC
| name | num |
| Jerry | 2 |
| Speike | 2 |
7. LIMIT 0,2
取排序后的前兩個
| name | num |
| Jerry | 2 |
| Speike | 2 |
備注:JOIN
join表示要關聯的表,on是要連接的條件。
通過from和join指出要執行的table_A和table_B。
首先通過笛卡爾積產生臨時表Temp1
通過on生成臨時表Temp2
簡單來講就是通過Table_A,生成一張臨時表Temp1,然找到Tabe_B的id和Table_A的id相同的部分組成表Temp2,Temp2里面包含了兩表相同的數據。
總結
以上就是一條SQL的執行過程
so,我們以后寫SQL也要有如下模版
SELECT XXXFROM XXXWHERE XXXGROUP BY XXXHAVING XXXORDER BY XXXLIMIT XXX;附圖如下:
?陽光明媚 清風徐來
掃碼關注我
郭大熊的公眾號
個人博客 : www.guodaxiong.com
如果不曾見過陽光,我本可以忍受黑暗
?Hi GuoDaXiong?
我是狗子
祝你幸福
總結
以上是生活随笔為你收集整理的mysql中的运算符的执行顺序_【MySQL】执行顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星 Galaxy A54 手机维修分数
- 下一篇: mysql win7 sp1 常见问题_