mysql怎么查询10-20条的数据

说实话,我刚接手一个老项目的时候也遇到过一个坑,当时我使用LIMIT子句检查1 0到2 0位的数据。
例如,有一个名为orders的表,其中包含数千条订单记录。
如果您使用 LIMIT 1 0, 1 0 来检索它们,您实际上会得到第 1 1 到 2 0 个。
但有趣的是,如果表中只有 5 00 位数据,而你使用 LIMIT 4 5 0, 1 0,MySQL 不会报错,而是直接返回最后 1 0 条数据给你,这是相当违反直觉的。

当时我不明白MySQL为什么要这么做。
后来我查看了手册,发现它应该兼容一些旧数据库的行为。
比如在老版本的Oracle中,没有LIMIT语法的时候,大家就用ROWNUM来模拟,这样的逻辑就一直延续下去。
因此,您会看到有人输入 LIMIT 9 , 1 0 并尝试获取前 1 0 个元素,但只获取了第 1 0 个元素。
这是因为从0开始计数的习惯没有改变。

关于负数的问题,确实负数不能传递。
我曾经遇到一个运维人员,他不小心输入了 LIMIT -1 0, 1 0 而不是 LIMIT -5 , 1 0,然后整个查询崩溃了。
这个错误信息非常简单:“你的SQL语法有错误;检查你的MySQL服务器版本对应的手册,然后输入REPEAT...”
还有一个容易被忽视的细节,就是偏移值很大时的性能问题。
我在网上处理了一个事件。
由于统计报表的需要,有的用LIMIT 1 00000、2 0来检查数据。
结果,CPU 增加了。
后来应用了OFFSET和WHERE last_updated > '2 02 3 -01 -01 '的组合过滤,查询时间从十几秒缩短到0.5 秒。
我自己没有运行过这个,但我记得数据在X左右,但我建议你确认一下。

最后,用好LIMIT的关键是要明白它不是按顺序取数字,而是跳过前面的偏移行,然后取行线。
因此,在搜索时,不能简单地将前后页上的LIMIT值相加。
我见过人们使用 LIMIT 1 0, 1 0 来滚动。
第一次成功,第二次直接改成LIMIT 2 0, 1 0,结果跳过了2 0个元素,漏掉了一页数据。

MYSQL 如何让新输入的数据永远都是显示在第一行。 谢谢。

老实说,当我第一次接触到 SQL 这个东西时,我有一段时间很头疼。
在 ORDER BY 之后添加 DESC 确实是一个烦人的小细节。
给我印象最深的是我在电子商务系统中调试订单列表的时间。
一位客户抱怨无法收到新订单。
事实证明我颠倒了时间字段并使用 DESC 而不是 ASC。
想一想,最后一个订单结束了,顾客当然感觉奇怪了。

有趣的是,DESC在经常使用后确实很容易记住。
例如,如果按创建时间排序,最新的数据通常会出现在前面。
它们必须按 DESC 创建的顺序排序。
但如果想按用户级别从高到低排序,则需要使用ORDER BY level DESC。
这里最重要的是 DESC。
如果不添加,默认是升序,数据会按照常规顺序排列,新的数据自然会在最后。
这个东西特别适合聊天记录、新闻推送等实时更新的场景。
您不想必须向下滚动才能看到新消息,对吧?
但是使用DESC时需要小心。
我曾经帮朋友定制了一份销售报表,按照销售额降序排序,结果发现第一行移了一个负数的销售额。
此时我的脸都绿了,所以我很快就改变了 ASC,感觉很不错。
这件事让我意识到,排序的时候,我们不仅要关注字段,还要关注字段的具体含义。

我记得数据是由三个字母DESC组成的,但是我建议你查看具体数据库的文档。
不同的系统可能存在个体差异。
我个人没有做过这方面的PostgreSQL分区表排序,但是对于普通表应该是类似的。