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






