Select語句執行順序
關鍵詞:SELECT執行順序
在調優之前,還需要掌握的知識是,SQL語句的執行順序,即一條正確的SQL語句,MySQL是先執行的哪部分,再執行的哪部分,最後執行的哪部分。SQL語句的順序往往也會覺得執行效率,所以瞭解了SQL的執行順序,有助於調整SQL結構來優化。
█ 思考
對於下面的SQL,它的執行順序是怎樣的?
SELECT DISTINCT s.name
FROM student s
left JOIN classroom c
ON s.class_id = c.id
WHERE s.age > 20
GROUP BY s.name
HAVING s.name is not null
ORDER BY s.age
LIMIT 10
█ 執行順序
執行順序 | 關鍵字 | 作用 |
1 | FROM、JOIN | 選擇和連線表獲取資料集 |
2 | ON | 篩選連線表資料 |
3 | WHERE | 篩選資料集 |
4 | GROUP BY | 對資料集進行聚合分組 |
5 | HAVING | 對聚合分組之後的資料進行篩選 |
6 | SELECT | 選擇查詢所需的欄位資料 |
7 | DISTINCT | 對查詢後的資料進行去重 |
8 | UNION | 合併多個資料集 |
9 | ORDER BY | 對資料集進行排序 |
10 | LIMIT | 對資料集進行限制行數 |
想想上面的執行順序,其實也比較容易理解。把資料庫看做成一個大的貨物倉庫,一個個貨架看做成一張張表,貨架上的每一排貨物就是一行資料。當老闆安排你去取貨架A、貨架B上的小號筆記本時,操作劉暢我哪敢應該會是這樣:首先你先確定要從哪幾個貨架上拿東西(FROM、JOIN),然後根據小號去篩選符合規定大小的筆記本(WHERE),如果要求按照筆記本的顏色分類,你就需要將前面篩選出來的筆記本按照顏色進行分類(GROUP HAVING)。緊接著按照某種顏色進行從早倒上進行排序(ORDER BY)。最後呢,如果說只要拿5個筆記本(LIMIT),那你就從這些結果集中取出5個筆記本拿給你老闆就行了。
FROM、JOIN
資料庫將首先計算FROM子句中指定的表(包括JOIN),以確定與查詢相關的整個資料集。資料庫將根據join ON子句合併來自所有表的資料,同時也從子查詢中獲取資料,甚至可能建立一些臨時表來儲存從這個子句中的子查詢返回的資料。
但是在許多情況下,比如表或連線表中的資料量很大時,資料庫的優化器會選擇首先評估WHERE部分,以檢視資料集的哪一部分可以忽略(最好使用索引),這樣在沒有必要的情況下就不會過多地膨脹資料集,提高效率。
WHERE
WHERE子句將是在FROM子句之後計算的第二個子句。經過FROM、JOIN已經有了工作資料集,現在可以根據WHERE子句中的條件過濾資料。從WHERE的執行順序可以看出,在WHERE語句中是無法使用SELECT語句中欄位的別名的以及聚合函式,比如“WHERE sum (available_stock) > 0”是不合法的。
GROUP BY
根據GROUP BY中出現的列來聚合資料,對資料進行分組。分組資料實際上是將資料分成不同的塊或桶,其中每個桶有一個鍵和一個匹配該鍵的行列表。沒有GROUPBY子句就像將所有行放入一個巨大的桶中。聚合資料之後,可以使用聚合函式為每個儲存桶返回每個組的值。這些聚合函式包括COUNT、MIN、MAX、SUM等。由於我們已經對資料進行了分組,因此此時無法再訪問原始行。這就是為什麼通過GROUP BY聚合資料後,在SELECT語句中只能使用GROUP BY中的列或者聚合函式的原因。
HAVING
對通過GROUP BY進行分組後的資料進行篩選。可以引用聚合函式,比如“HAVING sum (available_stock) > 0”是合法的。
SELECT
獲取到資料之後,我們可以通過SELECT來確定返回給客戶端的欄位資料。給你所需,你不需要的資料,資料庫也不會多給你一點。可以在SELECT子句中使用列名、聚合和子查詢。請記住,如果使用對聚合函式的引用,例如SELECT子句中的COUNT(*),那麼它只是對分組時已經發生的聚合的引用,因此聚合本身不會發生在SELECT子句中,但這只是對其結果集的引用。
DISTINCT
雖然在語法上DISTANCT是使用在列名前面的,即SELECT DISTANCE COLUMN FROM TABLE。但其確實在根據欄位篩選過資料之後執行。使用DISTINCT關鍵字時,資料庫將丟棄篩選和聚合發生後剩餘行中具有重複值的行。
UNION
UNION關鍵字將兩個查詢的結果集合併為一個結果集。大多數資料庫允許您在UNION-DISTINCT(這將丟棄組合結果集中的重複行)或UNION ALL(只合並結果集而不應用任何重複檢查)之間進行選擇。可以對聯合的結果集應用排序(orderby)和限制(LIMIT),方法與在常規查詢上應用排序(ORDER BY)和限制(LIMIT)相同。
ORDER BY
對資料集進行升序(ASC)或降序(DESC)排列。
LIMIT
通過limit對結果集進行數量的限制,比如只返回前10條資料(LIMIT 10),或者從第6個開始,返回10條(LIMIT 6,10)。
相關文章
- SQL語句中SELECT語句的執行順序SQL
- SQL Select語句邏輯執行順序SQL
- SQL Server中SELECT語句執行順序解析SQLServer
- for語句執行順序
- # 關於select關鍵字語句定義順序# 關於select關鍵字語句執行順序
- SELECT語句邏輯執行順序 你知道嗎?
- mySQL 執行語句執行順序MySql
- SQL語句執行順序SQL
- sql select語法執行順序SQL
- SQL 語句的執行順序SQL
- mysql 語句的執行順序MySql
- SQL Server SQL語句執行順序SQLServer
- SQL語句各子句的執行順序SQL
- SQL 查詢語句的執行順序解析SQL
- Hive SQL語句的正確執行順序HiveSQL
- Java for迴圈中語句執行的順序Java
- T-sql語句查詢執行順序SQL
- sql語句執行順序與效能優化(1)SQL優化
- 微軟官方:SELECT語句邏輯處理順序微軟
- mysql 中sql語句關鍵字的書寫順序與執行順序MySql
- for語句括號中程式碼執行順序介紹
- JavaScript for迴圈語句的執行順序和優化JavaScript優化
- Oracle SQL語句執行流程與順序原理解析OracleSQL
- SQL語句執行順序及建議--歸納整理SQL
- 一個 MySQL sql 語句執行順序帶來的 bugMySql
- MySQL 查詢常用操作(0) —— 查詢語句的執行順序MySql
- 一個針對 Python 語句執行順序的練習Python
- Sql執行順序SQL
- java中異常處理finally和return語句的執行順序Java
- mysql自定義排序順序語句MySql排序
- 關於觸發器在行級和語句級的執行順序問題觸發器
- SQL語句中的AND和OR執行順序問題SQL
- JavaScript執行順序分析JavaScript
- 任務執行順序
- JavaScript的執行順序JavaScript
- laravel Event執行順序Laravel
- Mybatis如何執行Select語句,你真的知道嗎?MyBatis
- 面試題思考:try 程式碼塊中含 return 語句時,程式碼執行順序面試題