以下两条 SQL 语句是否总是产生相同的结果集?
1. SELECT * FROM MyTable where Status='0' order by StartTime asc limit 10
2. SELECT * FROM (SELECT * FROM MyTable where Status='0' order by StartTime asc) limit 10
是的,但是订购子查询可能是一个不好的习惯。在第二个示例中,您可以在子查询之外进一步添加一个可行的方法ORDER BY
,例如
SELECT *
FROM (SELECT *
FROM Test
ORDER BY ID ASC
) AS A
ORDER BY ID DESC
LIMIT 10;
SQLite 仍然ORDER BY
在内部查询上执行,然后在外部查询中再次对它们进行排序。不必要的资源浪费。
我已经做了一个SQL Fiddle来演示,这样您就可以查看每个的执行计划。
没有。首先是因为该StartTime
列可能没有UNIQUE
约束。因此,即使是第一个查询也可能并不总是产生相同的结果——它本身!
其次,即使没有两行具有相同的 StartTime,答案仍然是否定的。
第一条语句将始终按顺序排列StartTime
并生成前 10 行。第二个查询可能会产生相同的结果集,但仅使用不了解ORDER BY
子查询中的 冗余的原始优化器。并且仅当执行计划包含此排序阶段时。
SQLite 查询优化器(目前)可能不是很聪明,只能做到这一点(真的不知道,我们必须检查 SQLite* 的源代码)。因此,这两个查询似乎一直在产生相同的结果。不过,指望它并不是一个好主意。你永远不知道 SQLite 的未来版本会发生什么变化。
我认为在任何 DBMS 中LIMIT
不使用 , 都不是一个好习惯。ORDER BY
它现在可能工作,但您永远不知道应用程序将使用这些查询多长时间。升级 SQLite 或更改 DBMS 时,您可能不在身边。
(*) @Gareth 的链接提供了执行计划,表明当前的 SQLite 代码足够愚蠢,可以执行冗余排序。