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)。
相關文章
- # 關於select關鍵字語句定義順序# 關於select關鍵字語句執行順序
- sql select語法執行順序SQL
- mySQL 執行語句執行順序MySql
- SQL語句執行順序SQL
- SQL 語句的執行順序SQL
- mysql 語句的執行順序MySql
- SQL語句各子句的執行順序SQL
- SQL 查詢語句的執行順序解析SQL
- Hive SQL語句的正確執行順序HiveSQL
- Java for迴圈中語句執行的順序Java
- sql語句執行順序與效能優化(1)SQL優化
- mysql 中sql語句關鍵字的書寫順序與執行順序MySql
- 一個 MySQL sql 語句執行順序帶來的 bugMySql
- MySQL 查詢常用操作(0) —— 查詢語句的執行順序MySql
- Mybatis如何執行Select語句,你真的知道嗎?MyBatis
- mysql自定義排序順序語句MySql排序
- Sql執行順序SQL
- insert into select語句與select into from語句
- python if語句有先後順序嗎Python
- SQL語句中的AND和OR執行順序問題SQL
- JavaScript執行順序分析JavaScript
- pipeline的執行順序
- 當執行一條select語句時,MySQL到底做了啥?MySql
- js執行順序Event LoopJSOOP
- Spring Aop的執行順序Spring
- sql mysql 執行順序 (4)MySql
- SQL SELECT 語句SQL
- 【SQL】14 UNION 操作符、SELECT INTO 語句、INSERT INTO SELECT 語句、CREATE DATABASE 語句、CREATE TABLE 語句SQLDatabase
- Pytest 順序執行,依賴執行,引數化執行
- async await、Promise、setTimeout執行順序AIPromise
- js解惑-函式執行順序JS函式
- [20191215]seq控制執行順序.txt
- 關於 Promise 的執行順序Promise
- 聊聊如何讓springboot攔截器的執行順序按我們想要的順序執行Spring Boot
- ORACLE中sql語句----運算子的優先順序OracleSQL
- join、volatile、newSingleThreadLatch 實現執行緒順序執行thread執行緒
- Java中如何保證執行緒順序執行Java執行緒
- [20191112]flock控制命令執行順序.txt