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 下标开始,查询指定条数,格式是:

扫描二维码关注公众号,回复: 8813975 查看本文章

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 子句的总结。欢迎文末留言。

发布了191 篇原创文章 · 获赞 280 · 访问量 52万+

猜你喜欢

转载自blog.csdn.net/u014745069/article/details/102994651