【SQL】纠正《SQL必知必会》中关于limit的错误描述offset

文章强调在SQL查询中,offset表示跳过指定行数而非从某行开始。offset0是从第一行开始,offset5则是跳过前五行。使用limit和offset组合进行数据分页,前者定义获取数据的数量,后者定义跳过的行数。正确的理解能避免新手在数据查询时的误解。

《SQL必知必会》里的limit语句部分

提到【第0行】,其实这是一种错误的说法,非常不利于理解。

同理,还说到了“offset 5是从哪儿开始”,这也是一种错误的说法。

offset 5,其实表示的是跳过5行,而不是从5行开始。

offset并不是给第1行数据标识下标为0的记号。新手很容易被误导,以为应该理解为“第0行”或者“offset指定从m行开始”。

之前看这里的时候就觉得理解起来很奇怪很别扭,大家真的不要被误导了。

不要有第0行数据的理解,也不要有offset m是从m行开始的理解。

正确理解offset

为什么我要说第0行这个说法有问题呢?
这就要说到offset这个词的解释了

offset 作名词时意为偏移,位移,偏移量,偏离量;off 离开 + set 开始;建立。

offset应该要理解为偏移量,表示跳过的意思,即跳过多少条数据。

offset 0,就是表示跳过0行,不要理解为从第0行开始。

offset 5,就是表示跳过5行,不要理解为从第5行开始。

默认情况偏移量为0,不写offset的时候就是默认偏移量为0,不跳过一行数据。

select * from table_name limit N offset M; 表示跳过M 条数据后,选取N条数据;

select * from table_name limit M,N; 表示跳过M条数据后,选取N条数据;

例如一张表id为:1,2,3,4,5,6

则 select * from table_name limit 3 offset 2: 获得的id为:3,4,5 

前一个数值为获取条数N,后一个数值为跳过个数M;

select * from table_name limit 3,2 :获得的id 为4,5 

前一个数值为跳过个数M,后一个为获取条数N。

《SQL必知必会》这本书是很多人的SQL入门书,大部分内容没问题,部分翻译或者解读是不太对的,希望大家不要被误导了,那些理解起来很牵强的东西,可以大胆质疑,小心求证,什么第0行的听起来就很别扭。欢迎讨论。

SQL中的`LIMIT`和`OFFSET`通常用于对查询结果进行分页处理。 ### 使用方法 - **`LIMIT`单独使用**:`LIMIT`用于限制查询结果返回的记录数量。例如,`SELECT * FROM table_name LIMIT 5;` 会返回`table_name`表中的前5条记录。 - **`LIMIT`和`OFFSET`配合使用**:`OFFSET`用于指定从哪一条记录开始返回结果。当`LIMIT`后面跟两个参数时,第一个数表示要跳过的数量(等同于`OFFSET`的作用),后一位表示要取的数量。如`SELECT * FROM test LIMIT 3 OFFSET 1;` (在MySQL 5以后支持这种写法),表示从第2条记录开始(偏移量为1),取3条记录 [^3]。 - **在子查询中使用**:可以在子查询中使用`LIMIT`和`OFFSET`来获取特定位置的数据。例如`SELECT (SELECT DISTINCT salary FROM Employee ORDER BY salary DESC LIMIT 1 OFFSET 1) AS SecondHighestSalary;` ,该查询用于获取`Employee`表中第二高的薪水 [^2]。 ### 作用 `LIMIT`和`OFFSET`主要用于实现数据的分页展示,在Web应用中,当需要展示大量数据时,通常会将数据分成多个页面,每次只显示一部分数据,以提高用户体验和系统性能。 ### 原理 `OFFSET`的工作原理是扫描到指定位置再返回数据,而不是直接定位。例如,当使用`OFFSET 1000`时,数据库会先扫描前1000条记录,然后再从第1001条记录开始返回结果。`LIMIT`则是在扫描到指定偏移量后,返回指定数量的记录。 ### 存在的问题 SQL中的`LIMIT`和`OFFSET`分页方式虽然简单易用,但在大数据量场景下存在诸多问题,如性能急剧下降、数据重复或丢失、资源消耗过大以及不适合分布式场景等。这些问题的根源在于`OFFSET`的工作原理是扫描到指定位置再返回数据,而不是直接定位,同时缺乏有效的数据一致性机制 [^1]。 ```sql -- 示例:获取表中前3条记录 SELECT * FROM your_table LIMIT 3; -- 示例:从第4条记录开始,获取2条记录 SELECT * FROM your_table LIMIT 2 OFFSET 3; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值