SQL查询语句中的limit 0是什么意思?

24

我看到人们写SQL查询,例如:

select count(*) 
from xxx_table 
where yyy='abc' 
limit 0

想知道这里的“limit 0”是什么意思?查阅了一些文档和讨论,但仍感到困惑。


1
你应该访问这个页面,http://dba.stackexchange.com/questions/105850/is-there-any-difference-between-limit-0-1-and-limit-1 - Sagar R
2
@SagarR,谢谢你的回复和点赞。我在研究时也找到了类似的内容。具体问题是关于在使用limit 0时使用count(*),我认为count(*)应该返回1行(即在某些条件下记录的计数,应该只返回一条记录/行)。所以,我认为添加或不添加limit 0不应该有差别-因为limit 0表示第一行(这是count(*)返回的唯一一行)。欢迎提供任何意见。:) - Lin Ma
1
你使用哪个数据库管理系统? - user330315
@a_horse_with_no_name,大多数情况下使用MySQL,但这是一个普遍的问题,非常感谢您的建议。为您的提问投票。 :) - Lin Ma
5个回答

24
根据MySQL文档
LIMIT 0会快速返回一个空集。这对于检查查询的有效性非常有用。如果您正在使用使结果集元数据可用的MySQL API,则还可以用它来获取结果列的类型。

2
@Lin Ma:'空集合' 意味着你在这个查询中没有获取到任何行。SELECT COUNT.. 会生成一行结果(就像其他许多 SELECT 语句一样),但你看不到它。 - Artur Opalinski
2
所以,这个查询的基本作用就是检查所提到的表和列是否存在。 - Thilo
1
@ArturOpalinski:简短而简单,但非常有用的答案。 - Sagar R
1
是的,我认为它实际上不会运行查询(即它不会进行任何计数)。但是,即使它进行计数,它也不会返回任何数据。 - Thilo
1
@LinMa:如果我提到MS Sql Server,有"TOP 0"类似于LIMIT 0,我发现在使用TOP 0时会出现执行变化。它不会扫描主键和聚集索引,因此您可以节省时间。 - Sagar R
显示剩余8条评论

7
我认为它只用于解析查询。
简单地说,执行查询的步骤如下:
  1. 解析查询
  2. 制定执行计划(包括选择最佳索引使用)。
  3. 从磁盘中读取数据。

谢谢Msf,点赞您的回复并想知道解析查询的目的是什么? - Lin Ma
1
我认为解析查询包括检查语法错误、命令类型以及使用元数据信息检查表和列名。 - Mostafa Vatanpour
感谢Msf,点赞。那为什么不将1限制在真实数据中进行测试呢? - Lin Ma
1
当使用count(*)时,将获取所有记录,而使用普通列将完全执行查询并仅获取一条记录。限制1。 - Mostafa Vatanpour
1
Mysql Workbench 可能使用低级函数和API来获取列类型/表,但我们使用普通的SQL命令来完成任务。 - Mostafa Vatanpour
显示剩余3条评论

2

我终于找到了一些有用的东西,当我为您创建演示时,请使用以下提到的代码片段检查执行计划,比较limit 0和1。

http://sqlfiddle.com/#!9/82a8f0/5

我发现,在执行中,如果我们使用Limit 0,它不会考虑表格。请查看上面提到的我的SQL Fiddle。

注意:我仅创建了一个简单的表格来检查演示中的执行计划差异。


1
感谢Sagar R的精彩示例,我投了赞成票。那么,你想证明select count(*) from abc limit 0不会返回或不执行任何操作吗?还是你想证明其他什么? - Lin Ma
1
其实我的问题是,在什么情况下,我们应该使用limit 0。感谢您的建议。 :) - Lin Ma

0

LIMIT子句用于在MYSQL中返回输出中的行数,它类似于SQL SERVER中的TOP子句和ORACLE中的ROWNUM子句。

例如:

MYSQL :-

SELECT *
FROM Persons
LIMIT 5;

SQL SERVER :-
SELECT TOP 2 * FROM Persons;

ORACLE :-
SELECT *
FROM Persons
WHERE ROWNUM <=5;

1
谢谢Ragesh,我会点赞你的回答。我的具体问题是什么意思是限制0?我理解什么是限制。 :) - Lin Ma

0

在语句之前运行 explain 并且有限制条件 0 和没有限制条件 0 会得到不同的结果:

有限制条件 0

"1" "SIMPLE"    \N  \N  \N  \N  \N  \N  \N  "Impossible WHERE"

没有

"1" "SIMPLE"    "{tableName}"   "index" \N  "{someFoundKey}"    "{keyLength}"   \N  "{rowCount}"    "Using index"

(\N 是我的 SQL GUI 的 null 输出)

结论 - 正如其他人所说,有效性的速度似乎是一个很好的猜测。这可能在更复杂的查询中更明显,例如连接、联合、交集等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接