MySQL中7個查詢命令的優(yōu)先級:
FROM --> WHERE --> GROUP BY --> HAVING -->SELECT --> ORDER BY --> LIMIT
=======================================================================
在MySQL中執(zhí)行查詢命令時會自動創(chuàng)建臨時表
什么是臨時表,及特點:
- 由[查詢命令]在內(nèi)存中生成虛擬表,被稱為臨時表
- 當前查詢命令執(zhí)行完畢后,MySQL服務(wù)器自動的將上一個查詢命令生成的臨時表自動銷毀處理
- 每一個查詢命令操作的是上一個查詢命令生成的臨時表,除了[FROM] 命令 (因為它永遠第一個執(zhí)行)
- 臨時報名稱就是硬盤上表文件名
- 在一個查詢語句結(jié)束后,用戶看到的臨時表只能是查詢語句中最后一個查詢命令生成的臨時表
=======================================================================
FROM查詢命令:
- FROM命令作用,將硬盤上的表文件加載到內(nèi)存中生成一個臨時表
- MySQL服務(wù)器存在7個查詢命令,在一個查詢語句執(zhí)行時,永遠第一個執(zhí)行的查詢命令是FROM {FROM SELECT }
=======================================================================
WHERE命令:
-----循環(huán)遍歷臨時表中每一個數(shù)據(jù)行,遍歷時每次只會取得一個數(shù)據(jù)行來判斷當前數(shù)據(jù)行是否滿足定位條件.在循環(huán)遍歷結(jié)束后,WHERE命令將所有滿足條件的數(shù)據(jù)行讀取出來生成一個全新的臨時表
-----WHERE命令在FROM命令只會執(zhí)行,因此操作的是FROM生成的臨時表1
循環(huán)遍歷臨時表的所有數(shù)據(jù)行,每次讀取一個數(shù)據(jù)行判斷是否滿足定位條件
在循環(huán)結(jié)束后,WHERE命令將所有滿足定位條件的數(shù)據(jù)行讀取出來保存到一個全新的臨時表
=======================================================================
GROUP BY 查詢命令:
- GROUP BY查詢命令被稱為[分組查詢命令]
- 執(zhí)行優(yōu)先級:FROM --->WHERE ----> GROUP BY------>SELECT
- 書寫格式:
SELECT 字段名 , 聚合函數(shù)
FROM 表名
WHERE 數(shù)據(jù)行定位條件
GROUP BY 分組字段
作用:
首先根據(jù)[分組字段]內(nèi)容對臨時表數(shù)據(jù)進行分類.
然后將具有相同特征的數(shù)據(jù)行保存到一個臨時表中.
七個查詢命令中,只有GROUP BY在執(zhí)行完畢后才有可能生成多個臨時表.
=======================================================================
HAVING 查詢命令
- 執(zhí)行的優(yōu)先級: FROM --> WHERE --> GROUP BY --> HAVING --> SELECT
- 書寫規(guī)則:
HAVING 就是GROUP BY 跟班小弟
①只有GROUP BY出現(xiàn)的時候,HAVING 才有機會出現(xiàn),他不會獨立出現(xiàn)在查詢語句
②出現(xiàn)的時候,必須出現(xiàn)在GROUP BY 后面
作用:
對GROUP BY生成的臨時表進行[統(tǒng)計分析],將不滿足條件的臨時表從內(nèi)存中進行銷毀。HAVING任務(wù)是銷毀掉內(nèi)存中臨時表.
HAVING通常與聚合函數(shù)共同使用;
=======================================================================
WHERE 與 HAVING的區(qū)別:
WHERE 命令執(zhí)行完畢后,將滿足條件數(shù)據(jù)行讀取出來生成一個全新的臨時表
HAVING命令執(zhí)行時,負責將GROUP BY生成的臨時表中不滿足條件的臨時表進行銷毀
-----------------------------------------------------------------------------------------------------------------
WHERE每次操作一個數(shù)據(jù)行,因此WHERE后邊的判斷條件不能使用聚合函數(shù)
HAVING每次操作的是一個臨時表,因此HAVING后面應(yīng)該使用聚合函數(shù)作為判斷條件
-----------------------------------------------------------------------------------------------------------------
WHERE命令必須聲明在GROUP BY 前方
HAVING命令必須生命在GROUP BY后方
=======================================================================
SELECT行為特征:
- 如果SELECT操作的臨時表由(FROM或者WHERE)提供,此時SELECT像切蛋糕一樣將制定字段所有的內(nèi)容讀取出來,組成一個全新的臨時表
- 如果SELECT操作的臨時表由(GROUP BY 或者 HAVING)提供,此時SELECT可能面對多個臨時表,SELECT將會一次操作每一個臨時表.在操作某一個臨時表時,只會讀取指定字段的[第一行數(shù)據(jù)],然后將從多個臨時表讀取內(nèi)容組成一個全新的臨時表.
SELECT 操作的是GROUP BY 提供的臨時表,此時讀取的字段內(nèi)容應(yīng)該能表示當前臨時表所有數(shù)據(jù)共同特征,因此此時SELECT讀取字段一般都是GROUP BY所采用分組字段
=======================================================================
ORDER BY 查詢命令
- 執(zhí)行優(yōu)先級: FROM --> WHERE --> GROUP BY -->HAVING --> SELECT -->ORDER BY
- 作用:
對[SELECT生成臨時表]中數(shù)據(jù)進行排序,將排序后的數(shù)據(jù)行組成一個全新的臨時表展示出來;
=======================================================================
LIMIT 查詢命令
執(zhí)行優(yōu)先級:
FROM --> WHERE --> GROUP BY --> HAVING --> SELECT --> ORDER BY --> LIMIT
書寫規(guī)則 :
SELECT 字段名,聚合函數(shù)
FROM 表名
WHERE 對數(shù)據(jù)進行定位判斷條件
GROUP BY 分組字段1 ,分組字段2….
HAVING 使用聚合函數(shù)統(tǒng)計當前臨時表是否可以被刪除
ORDER BY 根據(jù)SELECT提供的臨時表字段進行排序
LIMIT 起始數(shù)據(jù)行位置,截取行數(shù)
作用:
對臨時表數(shù)據(jù)進行截取 ,將截取到的數(shù)據(jù)保存到全新的臨時表中
=======================================================================
多字段分組規(guī)則:
- 分組字段執(zhí)行順序?qū)τ谧罱K結(jié)果沒有任何影響,GROUP BY SEX,HOME與GROUP BY HOME,SEX得到的結(jié)果完全一樣
- GROUP BY一次只能根據(jù)一個分組字段進行臨時表拆分
- 從第二個分組字段開始,每一個分組字段操作的臨時表時上一個分組字段生成的臨時表
=======================================================================
七個查詢命令的總結(jié):
書寫格式
SELECT 字段名,聚合函數(shù)
FROM 表名
WHERE 對數(shù)據(jù)進行定位判斷條件
GROUP BY 分組字段1 ,分組字段2….
HAVING 使用聚合函數(shù)統(tǒng)計當前臨時表是否可以被刪除
ORDER BY 根據(jù)SELECT提供的臨時表字段進行排序
LIMIT 起始數(shù)據(jù)行位置,截取行數(shù)
執(zhí)行優(yōu)先級:
FROM ---> WHERE ---> GROUP BY ---> HAVING ---> SELECT ---> ORDER BY ---> LIMIT
- 查詢語句找那個最先執(zhí)行的永遠都是FROM
- 七個查詢命令中,只有FROM讀取硬盤上臨時表,剩余的查詢命令操作的只能是上一個查詢命令生成的臨時表.
- 七個查詢命令中,只有GROUP BY 執(zhí)行完畢后,有可能生成多個臨時表
- 七個查詢命令中,只有HAVING執(zhí)行完畢后不會生成新的臨時表
- 查詢命令執(zhí)行過程中,當前查詢命令執(zhí)行完畢后,MySQL服務(wù)器將上一個查詢命令生成的臨時表進行銷毀,所以用戶最終看到的臨時表只能是最后一個查詢命令生成的臨時表
- SELECT執(zhí)行行為與操作的臨時表的提供方不同