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