我有一个表只有一列varchar
。
我想获得最后一行,但我无法应用order by
。
以下查询未提供所需结果。
select top 1 from SampleTbl order by columnName desc
答案 0 :(得分:5)
数据库表本质上是未分类的。表中没有最后一行。
如果存在聚簇索引,则记录的存储顺序与聚簇索引的顺序相同,但这并不意味着行的顺序 - 除非在查询中指定order by
子句,否则database保证所述查询返回的行的顺序。
来自Wikipedia page on tables(强调我的):
就数据库的关系模型而言,表可以被认为是关系的方便表示,但两者并不是严格等同的。例如,SQL表可能包含重复的行,而真正的关系不能包含重复的元组。类似地,表示为表意味着对行和列的特定排序,而关系明确地是无序的。但是,数据库系统不保证行的任何排序,除非在查询表的SELECT语句中指定了ORDER BY子句。
另见Aaron Betrand的Bad habits to kick : relying on undocumented behavior,标题为“没有ORDER BY订购”的段落:
...我想说清楚:除非你使用ORDER BY子句,否则排序是任意的。在没有ORDER BY的情况下,您永远不应该依赖于在查询中观察到的顺序 - 如果您真的不关心结果返回的顺序,那么您应该只发出没有ORDER BY子句的查询。在这种情况下,您可以想象每次行都会以不同的随机顺序返回,即使事实并非如此(随机具有完全独立于任意的含义,但就像我说的那样,想象一下)。