Select語句執行順序

www.Rui發表於2020-11-18

關鍵詞: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)。

相關文章