引言
到目前爲止,已經總結了常見的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 內部的實際執行順序。
粗體標出的 SELECT 、FROM、WHERE 幾乎是每個SQL 都會用到(但不絕對,有時候甚至一個 SELECT 就是一條SQL)。
其中唯一與書寫順序不同的執行就是 SELECT 子句了,雖然寫在SQL語句的最前面,執行順序卻相對靠後。而其中大部分執行步驟與書寫步驟保持一致。
綜上,就是關於SQL 語句執行順序 和 LIMIT 子句的總結。歡迎文末留言。