MySQL 基礎 ———— SQL語句的執行順序與 LIMIT 子句

引言

到目前爲止,已經總結了常見的SQL子句,包括 SELECT 、FROM、JOIN ... ON、WHERE、GROUP BY、HAVING、ORDER BY。

雖然SQL的書寫順序是固定的,但在MySQL引擎中執行的順序並不完全和書寫順序一致。除了上述這些子句,下面將會介紹另一個比較常用的子句 LIMIT ,並且總結一下SQL 語句的執行順序。

一、LIMIT 子句

LIMIT 子句用於限制查詢結果的數量,也常常作爲網站頁面展示時分頁查詢的基礎支持。

LIMIT 子句可以接收 1 個參數,或 2 個參數。

當接收 1 個參數時,表示僅輸出指定的條數,比如,我們查詢員工表裏薪酬大於平均工資的員工信息,然後按工資降序,取前兩個:

首先查薪水大於平均工資的員工信息:

SELECT * FROM emp
WHERE salary > (
    SELECT AVG(salary) FROM emp
)

然後,根據工資降序,並選出頭兩個:

SELECT * FROM emp
WHERE salary > (
    SELECT AVG(salary) FROM emp
)
ORDER BY salary DESC
LIMIT 2

一般,我們使用 LIMIT 子句都會配合 ORDER BY 進行某種業務要求上的排序,然後再進行限制。

大概 LIMIT 子句接收兩個參數的時候,表示從某個 index 下標開始,查詢指定條數,格式是:

LIMIT record_index, size 

其中 record_index 是從 0  開始的,也就是說,表或結果集中的第一條記錄就是第 0 條,第二條是 第 1 條,依此類推。size 代表查詢出來的數量。

比如下面這條語句:

SELECT * FROM student
ORDER BY class_id, stu_age
LIMIT 0, 10

這句SQL的含義是將 LIMIT 子句之前查詢出來的結果集(排序之後),從第 0 條開始,顯示 10 條,即第 0 到第 9 條。

如果想再進行 10 條輸出,那麼就可以改變 record_index 的值,繼續往後輸出:

SELECT * FROM student
ORDER BY class_id, stu_age
LIMIT 10, 10

於是,就有了初步的分頁效果。通過總結,我們也可以得出與頁面分頁信息有這樣的關係:

LIMIT  (pageNum - 1) * size, size

其中,pageNum 代表第幾頁,從第一頁開始,這是一個頁面給用戶展示的信息,肯定不會告訴用戶要從第 0 頁開始。size 代表每頁顯示的記錄條數,這個值可以由用戶自定義,也可以由產品固定寫死,具體根據實際需要來設計。總之,這個公式說明了實際業務場景中的頁號、記錄條數與 LIMIT 子句的關係,可以通過它來設計分頁功能。

二、SQL 語句執行順序

到目前爲止,比較常見的子句,及其內部執行順序如下:

第7步:SELECT 查詢列表

第1步:FROM 表名

第2步:JOIN  關聯表

第3步:ON  關聯條件

第4步:WHERE 篩選條件

第5步:GROUP BY  分組字段

第6步:HAVING 分組後篩選條件

第8步:ORDER BY 排序字段

第9步:LIMIT  輸出限制

上面的子句列表中,冒號右側是 SQL 各個子句的書寫順序,冒號左側的 “第 xx 步” 是 MySQL 內部的實際執行順序。

粗體標出的 SELECTFROMWHERE 幾乎是每個SQL 都會用到(但不絕對,有時候甚至一個 SELECT 就是一條SQL)。

其中唯一與書寫順序不同的執行就是 SELECT 子句了,雖然寫在SQL語句的最前面,執行順序卻相對靠後。而其中大部分執行步驟與書寫步驟保持一致。

綜上,就是關於SQL 語句執行順序 和 LIMIT 子句的總結。歡迎文末留言。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章